我想创建一个包含两个 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
命令运行。 Hence, I think the previous CMD
commands are killed in Dockerfile
because when I remove the last two CMD
, the first CMD
works well .
有没有办法在后台运行多个 Python 脚本和一个可执行文件?
我也尝试过使用 bash 文件,但也没有成功。
原文由 Benyamin Jafari - aGn 发布,翻译遵循 CC BY-SA 4.0 许可协议
如 文档 中所述,docker文件中只能有一个CMD,如果有多个则最后一个覆盖其他并生效。使用 docker 的一个关键点可能是隔离你的程序,所以乍一看,你可能希望将它们移动到单独的容器中并使用共享卷或 docker 网络相互通信,但如果你真的需要它们在同一个容器,将它们包含在 bash 脚本中并将最后一个 CMD 替换为 CMD
run.sh
将同时运行它们:将
COPY run.sh
添加到 Dockerfile 并使用RUN chmod a+x run.sh
使其可执行。 CMD 应该是CMD ["./run.sh"]