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

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

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

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

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

2
Chris 4 Июл 2019 в 07:06

4 ответа

Лучший ответ

Это легко сделать, используя 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
constt 4 Июл 2019 в 05:00

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

Докерфил:

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
Kārlis Ābele 4 Июл 2019 в 04:21

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

  • Создайте 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
mchawre 4 Июл 2019 в 04:39

Любая команда, которую вы вводите в конце команды 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
David Maze 4 Июл 2019 в 09:16