为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

红糖糍粑 2021-09-25 10:07:12
我想创建一个包含两个 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.shDockerfile 内容:FROM ubuntu:18.04        RUN apt updateRUN apt-get install -y python3.6 python3-pip python3-dev build-essential gcc \    libsnmp-dev snmp-mibs-downloaderRUN pip3 install --upgrade pipRUN mkdir /appWORKDIR /appCOPY . /appWORKDIR /app/snmp_collectorRUN pip3 install -r requirements.txtWORKDIR /app/proto_conversionRUN pip3 install -r requirements.txtWORKDIR /app/pythonic_project1CMD python3 __main__.pyWORKDIR /app/pythonic_project2CMD python3 __main__.pyWORKDIR /app/exec_projectCMD ["./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 文件也没有成功。
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

最佳实践是将它们作为三个独立的容器启动。这是双重正确的,因为您正在使用三个独立的应用程序,将它们捆绑到一个容器中,然后尝试从中启动三个独立的东西。


在您的每个项目子目录中创建一个单独的 Dockerfile。这些可以更简单,特别是对于只包含已编译二进制文件的


# execproject/Dockerfile

FROM ubuntu:18.04

WORKDIR /app

COPY . ./

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 的组件。


查看完整回答
反对 回复 2021-09-25
  • 3 回答
  • 0 关注
  • 464 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信