Я пытаюсь сделать что-то очень простое (я думаю), я хочу создать образ докера и запустить два разных скрипта из одного и того же образа в параллельно работающих контейнерах.
Что-то простое, как
Контейнер 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
Но работают два разных скрипта.
Я все еще новичок во всем этом, поэтому, если это глупый вопрос, я заранее извиняюсь и благодарю всех за работу со мной.






Если вы настроены на использование одного и того же образа, я бы посоветовал вам установить 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.pyprint("Hello")
script2.pyprint("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.
Это очень помогло, это именно то, что мне было нужно.
Любая команда, которую вы помещаете в конце команды docker run (или поля Docker Compose command:), заменяет CMD в Dockerfile. Я бы посоветовал по-прежнему использовать какой-нибудь полезный CMD по умолчанию, но вы всегда можете просто
docker run --name hello myimage python script.py
docker run --name world myimage python script2.py
Это идея, а не инструкция, поэтому она не публикуется в качестве ответа :) Один из вариантов — использовать переменные среды — поскольку вы хотите, чтобы контейнеры запускали одно и то же изображение, вам потребуется два выполнения
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, но это совершенно необязательно.