Как запустить разные скрипты Python в параллельных контейнерах из одного изображения - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь сделать что-то очень простое (я думаю), я хочу создать образ докера и запустить два разных скрипта из одного и того же образа в параллельно работающих контейнерах.

Что-то простое, как

Контейнер 1 -> печать («Привет»)

Контейнер 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 ]

1 голос
/ 04 июля 2019

Любая команда, которую вы вводите в конце команды docker run (или в поле Docker Compose command:), заменяет CMD в файле Docker. Я бы по-прежнему предлагал добавить какое-нибудь полезное CMD по умолчанию, но вы всегда можете просто

docker run --name hello myimage python script.py
docker run --name world myimage python script2.py
1 голос
/ 04 июля 2019

Попробуйте эти шаги, оно должно работать.

  • Создать 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 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
$

ПРИМЕЧАНИЕ: Здесь мы используем один и тот же образ докера myimage:v1 и просто меняем точку входа в каждой команде запуска докера.

Подробнее здесь .

Надеюсь, это поможет.

1 голос
/ 04 июля 2019

Вы можете сделать это легко, используя 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, а во втором command: python script2.py.

1 голос
/ 04 июля 2019

Если вы используете одно и то же изображение, я бы посоветовал вам установить 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"]

А затем просто создайте их как отдельные образы и запустите так же, как и раньше

...