Как запускать разные скрипты Python в параллельных контейнерах из одного образа

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

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

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

Но работают два разных скрипта.

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

Это идея, а не инструкция, поэтому она не публикуется в качестве ответа :) Один из вариантов — использовать переменные среды — поскольку вы хотите, чтобы контейнеры запускали одно и то же изображение, вам потребуется два выполнения docker run $image_name. Между ними вы можете по-разному устанавливать env vars, например. docker run $image -e RUN_SCRIPT=script1.py и docker run $image RUN_SCRIPT=script2.py. Чем в dockerfile, вам нужно заставить его распознать env var и запустить соответствующий скрипт. Наконец, вы можете «автоматизировать» запуск этих двух контейнеров вместе с помощью docker-compose, но это совершенно необязательно.

J0HN 04.07.2019 06:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
1 727
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если вы настроены на использование одного и того же образа, я бы посоветовал вам установить ENTRYPOINT на python, а затем использовать команду запуска docker для запуска контейнеров, предоставив скрипты в качестве CMD, например:

Докерфайл:

FROM python

...

ENTRYPOINT ["python"]

И используйте команду запуска докера, например

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"]

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

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

  • Создайте 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 и просто меняем точку входа в каждой команде запуска докера.

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

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

Ответ принят как подходящий

Вы можете легко сделать это, используя Докер Сочинять. Вот простой файл 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.

Это очень помогло, это именно то, что мне было нужно.

Chris 04.07.2019 16:37

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

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

Другие вопросы по теме