Skip to main content
 首页 » 编程设计

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

2025年05月04日36linjiqin

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


这是我的主包 (dockerized_pa​​ckage) 树:

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 文件,但也没有成功。

请您参考如下方法:

如 documentation 中所述,docker文件中只能有一个CMD,如果有多个则最后一个覆盖其他的生效。 使用 docker 的一个关键点可能是隔离你的程序,所以乍一看,你可能希望将它们移动到单独的容器中并使用共享卷或 docker 网络相互通信,但如果你真的需要它们在同一个容器,将它们包含在 bash 脚本中并将最后一个 CMD 替换为 CMD run.sh 将同时运行它们:

#!/bin/bash 
 
exec python3 /path/to/script1.py & 
exec python3 /path/to/script2.py 

将 COPY run.sh 添加到 Dockerfile 并使用 RUN chmod a+x run.sh 使其可执行。 CMD 应该是 CMD ["./run.sh"]