相关文章推荐
玩足球的黄花菜  ·  DevTools (Microsoft ...·  1 年前    · 
乖乖的灯泡  ·  jupyter notebook ...·  1 年前    · 
低调的红豆  ·  VLC ...·  1 年前    · 

如何在服务运行后在docker-compose中运行一个命令?

0 人关注

我已经搜索过了,但我找不到解决我问题的方法。我的docker-compose.yml文件如下。

version: '2.1' services: mongo: image: mongo_db build: mongo_image container_name: my_mongodb restart: always networks: - isolated_network ports: - "27017" environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root_pw entrypoint: ["python3", "/tmp/script/get_api_to_mongodb.py", "&"] networks: isolated_network:

所以在这里我使用了一个自定义的Dockerfile。我的Dockerfile如下。

FROM mongo:latest
RUN apt-get update -y
RUN apt-get install python3-pip -y
RUN pip3 install requests
RUN pip3 install pymongo
RUN apt-get clean -y
RUN mkdir -p /tmp/script
COPY get_api_to_mongodb.py /tmp/script/get_api_to_mongodb.py
#CMD ["python3","/tmp/script/get_api_to_mongodb.py","&"]

在这里,我想创建一个有MongoDB的容器,在创建容器后,我使用API收集数据并将数据发送到MongoDB。但是当我运行python脚本的时候,mongodb并没有被初始化。所以我需要在容器创建后,在mongodb初始化后立即运行我的脚本。谢谢。

python
mongodb
docker
docker-compose
dockerfile
Yunus Emrah Uluçay
Yunus Emrah Uluçay
发布于 2022-09-01
1 个回答
David Maze
David Maze
发布于 2022-09-01
已采纳
0 人赞同

你应该把这个脚本作为一个单独的容器来运行。 它不是 "数据库的一部分",就像一个扩展或插件,而是一个普通的客户进程,碰巧连接到数据库,而且你想在相对较早的时候运行。 一般来说,如果你想尝试在一个容器中启动一个后台进程,在两个独立的容器中运行前台进程通常是一个更好的方法。

这种设置意味着你可以使用一个更简单的Docker文件,从预装了Python的镜像开始。

FROM python:3.10
RUN pip install requests pymongo
WORKDIR /app
COPY get_api_to_mongodb.py .
CMD ["./get_api_to_mongodb.py"]

然后在你的 Compose 设置中,将其作为第二个容器与第一个容器一起声明。 由于脚本是在自己的镜像中,你可以使用未经修改的mongo镜像。

version: '2.4'
services:
  mongo:
    image: mongo:latest
    restart: always
    ports:
      - "27017"
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=root_pw
  loader:
    build: .
    restart: on-failure
    depends_on:
      - mongodb
    # environment:
    #   - MONGO_HOST=mongo
    #   - MONGO_USERNAME=root
    #   - MONGO_PASSWORD=root_pw

注意,每次你运行docker-compose up -d时,加载器都会重新运行。 你也可能需要等待数据库进行初始化,然后才能运行加载器进程;参见Docker Compose在启动Y之前等待容器X.

你很可能为你的实际应用提供了一个现有的编撰服务

version: '2.4'
services:
  mongo: { ... }
    build: .