如何在同一图像的并行容器中运行不同的python脚本

时间:2019-07-04 04:06:49

标签: python docker docker-compose containers dockerfile

我正在尝试做一个非常简单的事情(我认为),我想构建一个docker映像并在并行运行的容器中从同一映像启动两个不同的脚本。

简单的事情

容器1-> print(“ Hello”)

容器2->打印(“世界”)

我做了一些研究,但有些技术似乎在设计上有些过分,而另一些却做了

CMD ["python", "script.py"] && ["python", "script2.py"]

这不是我想要的。

我很想看到类似的东西

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2

但是运行两个不同的脚本。

我对所有这一切还很陌生,因此,如果这是一个愚蠢的问题,我事先表示歉意,并感谢大家与我一起工作。

4 个答案:

答案 0 :(得分:1)

如果您设置使用相同的图像,那么我建议您将ENTRYPOINT设置为python,然后使用docker run命令通过提供脚本作为CMD来启动容器,如下所示:

Dockerfile:

FROM python

...

ENTRYPOINT ["python"]

然后像这样使用docker run命令

docker run -d my_image script.py && docker run -d my_image script2.py

哪个将启动两个分别运行单独脚本的容器

但是-我想保持图像干净,因为没有任何其他脚本或程序包对于我的服务正常工作是不必要的,因此在这种情况下,我将简单地创建两个单独的图像,每个图像都包含一个脚本和然后类似地运行它们。

示例:

FROM python

COPY script.py script.py

ENTRYPOINT ["python"]

CMD ["script.py"]

第二张图片:

FROM python

COPY script2.py script2.py

ENTRYPOINT ["python"]

CMD ["script2.py"]

然后将它们构建为单独的图像,并以与以前相同的方式运行

答案 1 :(得分:1)

尝试这些步骤,它应该可以工作。

  • 使用内容创建一个Dockerfile
FROM python:3.7-alpine
COPY script1.py /script1.py
COPY script2.py /script2.py
CMD ["/bin/sh"]
  • script1.py
print("Hello")
  • script2.py
print("World")
  • 构建docker映像docker build -t myimage:v1 .
  • 运行容器
$ docker run -it --rm --entrypoint python myimage:v1 /script1.py
Hello
$
$ docker run -it --rm --entrypoint python myimage:v1 /script2.py
World
$

注意::这里我们使用相同的docker映像myimage:v1,只是在每个docker run命令中更改了入口点。

更多信息here

希望这会有所帮助。

答案 2 :(得分:1)

您可以使用Docker Compose轻松地做到这一点。这是一个简单的docker-compose.yml文件,只是为了说明这个想法:

version: '3'

services:
  app1:
    image: alpine
    command: >
      /bin/sh -c 'while true; do echo "pre-processing"; sleep 1; done'

  app2:
    image: alpine
    command: >
      /bin/sh -c 'while true; do echo "post-processing"; sleep 1; done'

如您所见,两个服务使用相同的映像,在此示例中为alpine,但是它们运行的​​命令不同。执行docker-compose up并查看输出:

app1_1  | pre-processing
app2_1  | post-processing
app2_1  | post-processing
app2_1  | post-processing
app1_1  | pre-processing
app2_1  | post-processing
app1_1  | pre-processing
app2_1  | post-processing
...

在您的情况下,您只需将图像更改为图像,例如myimage:v1,然后更改服务命令,以便第一个服务定义具有command: python script1.py行,第二个服务定义具有{{1} }。

答案 3 :(得分:1)

您在docker run命令(或Docker Compose command:字段)末尾添加的任何命令都将替换Dockerfile中的CMD。我建议仍然放入一些有用的默认CMD,但您始终可以

docker run --name hello myimage python script.py
docker run --name world myimage python script2.py