如何使用 Docker 运行多个 Python 脚本和一个可执行文件?

我想创建一个包含两个 Python 包以及一个包含可执行文件的包的容器。


这是我的主包 (dockerized_package) 树:

dockerized_project

├── docker-compose.yml

├── Dockerfile

├── exec_project

│   ├── config

│   │   └── config.json

│   ├── config.json

│   ├── gowebapp

├── pythonic_project1

│   ├── __main__.py

│   ├── requirements.txt

│   ├── start.sh

│   └── utility

│       └── utility.py

└── pythonic_project2

    ├── collect

    │   ├── collector.py

    ├── __main__.py

    ├── requirements.txt

    └── start.sh

Dockerfile 内容:

FROM ubuntu:18.04

        

RUN apt update

RUN apt-get install -y python3.6 python3-pip python3-dev build-essential gcc \

    libsnmp-dev snmp-mibs-downloader


RUN pip3 install --upgrade pip


RUN mkdir /app

WORKDIR /app

COPY . /app


WORKDIR /app/snmp_collector

RUN pip3 install -r requirements.txt

WORKDIR /app/proto_conversion

RUN pip3 install -r requirements.txt


WORKDIR /app/pythonic_project1

CMD python3 __main__.py


WORKDIR /app/pythonic_project2

CMD python3 __main__.py


WORKDIR /app/exec_project

CMD ["./gowebapp"]

docker-compose 内容:

version: '3'


services:

  proto_conversion:

      build: .

      image: pc:2.0.0

      container_name: proto_conversion

#      command: 

#        - "bash  snmp_collector/start.sh"

#        - "bash  proto_conversion/start.sh"

      restart: unless-stopped

      ports:

        - 8008:8008

      tty: true

问题:

当我用 运行这个项目时docker-compose up --build,只CMD运行最后一个命令。因此,我认为前面的CMD命令被杀死了,Dockerfile因为当我删除最后两个时CMD,第一个CMD运行良好。


有没有办法在后台运行多个 Python 脚本和一个可执行文件?


我也尝试过使用 bash 文件也没有成功。


红糖糍粑
浏览 465回答 3
3回答

回首忆惘然

最佳实践是将它们作为三个独立的容器启动。这是双重正确的,因为您正在使用三个独立的应用程序,将它们捆绑到一个容器中,然后尝试从中启动三个独立的东西。在您的每个项目子目录中创建一个单独的 Dockerfile。这些可以更简单,特别是对于只包含已编译二进制文件的# execproject/DockerfileFROM ubuntu:18.04WORKDIR /appCOPY . ./CMD ["./gowebapp"]然后在您的docker-compose.yml文件中有三个单独的节来启动容器version: '3'services:  pythonic_project1:    build: ./pythonic_project1    ports:      - 8008:8008    env:      PY2_URL: 'http://pythonic_project2:8009'      GO_URL: 'http://execproject:8010'  pythonic_project2:    build: ./pythonic_project2  execproject:    build: ./execproject如果你真的不能重新排列你的 Dockerfiles,你至少可以从docker-compose.yml文件中的同一个镜像启动三个容器:services:  pythonic_project1:    build: .    workdir: /app/pythonic_project1    command: ./__main__.py  pythonic_project2:    build: .    workdir: /app/pythonic_project1    command: ./__main__.py使用多个容器和图像构建项目有几个很好的理由:如果您运行自己的 shell 脚本并使用后台进程(就像其他答案一样),它只是不会注意到其中一个进程是否死亡;在这里你可以使用 Docker 的重启机制来重启单个容器。如果您对其中一个程序进行了更新,则只能更新并重新启动该单个容器,而其余部分保持不变。如果您使用过更复杂的容器编排器(Docker Swarm、Nomad、Kubernetes),不同的组件可以在不同的主机上运行,并且在单个节点上需要较小的 CPU/内存资源块。如果您使用过更复杂的容器编排器,您可以单独扩展使用更多 CPU 的组件。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python