Docker - запуск нескольких python скриптов с помощью одного образа
Имеется сервер, на котором стоит Docker, и проект из нескольких python-скриптов, которые обязательно должны запускаться по-отдельности, их нельзя запустить вместе через exec
Структура папок примерно такая:
- project
- scripts 1
- app.py
- scripts 2
- app.py
- scripts-demo
- app.py
- docker
- Dockerfile
- requirements.txt
Я хочу с помощью Dockerfile создать простой образ (image), в котором будет python 3.8 и библиотеки, которые находятся в requirements.txt. И чтобы в дальнейшем я мог примерно так запускать контейнер для каждого app.py:
docker run [путь до скрипта] [название образа] -it --restart=always
Сейчас мой Dockerfile такой:
FROM python:3.8
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
Обратите внимание, тут нет CMD, так как мне не нужно ничего запускать на этом этапе, мне нужно только чтобы был образ python 3.8 с нужными мне библиотеками
После build создается образ, как мне и нужно, проблема возникает на этапе попытки запуска скрипта в контейнере с этим образом. Я попробовал запустить так:
docker run -v root/project/scripts 1/:/dir/ python /dir/app.py -it --restart=always
Но получаю ошибку:
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/dir/app.py": permission denied: unknown.
Как я понял ему не хватает прав для запуска скрипта, но решения не нашел в гугле, пробовал и через chmod делать, и через групповую политику. Мне кажется я при самой настройке где-то накосячил, но в докере очень плохо разбираюсь и не понимаю где она
Ответы (1 шт):
UPD целевой python находится в /usr/local/bin, поэтому изначальный рецепт с запуском /usr/bin/python3 был неверным.
Вам нужно запускать не скрипт, а /usr/local/bin/python3
Я бы делал так.
Сначала создал свой образ для контейнера из
Dockerfile:docker build -t my-python ./docker/Затем прописал все сервисы в
docker-compose.yaml:version: '3' services: app1: image: my-python command: /usr/local/bin/python3 /dist/app.py restart: always volumes: - "./app1/:/dist" app2: image: my-python command: /usr/local/bin/python3 /dist/app.py restart: always volumes: - "./app2/:/dist"И запустил бы всё разом командой
docker compose up
Но если вам действительно нужно запускать контейнеры поштучно вручную, то команда такая:
docker run -it -v $PWD/app1:/dir --restart=always my-python \
/usr/local/bin/python3 /dir/app