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

Ben*_*ari 7 python bash docker docker-compose

我想创建一个包含两个 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
Run Code Online (Sandbox Code Playgroud)

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"]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

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

Far*_*igo 9

正如文档中提到的,docker文件中只能有一个CMD,如果有更多,最后一个会覆盖其他并生效。使用 docker 的一个关键点可能是隔离您的程序,因此乍一看,您可能希望将它们移动到单独的容器中并使用共享卷或 docker 网络相互通信,但如果您确实需要它们运行同一个容器,将它们包含在 bash 脚本中,并用 CMD 替换最后一个 CMDrun.sh将它们并排运行:

#!/bin/bash

exec python3 /path/to/script1.py &
exec python3 /path/to/script2.py
Run Code Online (Sandbox Code Playgroud)

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


fra*_*own 5

通过entrypoint.sh 尝试一下

ENTRYPOINT ["/docker_entrypoint.sh"]
Run Code Online (Sandbox Code Playgroud)

docker_entrypoint.sh

#!/bin/bash

set -e

exec python3 not__main__.py &
exec python3 __main__.py 
Run Code Online (Sandbox Code Playgroud)

符号&表示您在后台将服务作为守护进程运行

  • “exec”语句在这里似乎毫无用处。`set -e` 对后台作业没有任何好处。可能将其与两个“exec”语句一起取出,只留下两个具有不同参数的“python3”命令。 (2认同)