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 шт):

Автор решения: Pak Uula

UPD целевой python находится в /usr/local/bin, поэтому изначальный рецепт с запуском /usr/bin/python3 был неверным.

Вам нужно запускать не скрипт, а /usr/local/bin/python3

Я бы делал так.

  1. Сначала создал свой образ для контейнера из Dockerfile:

    docker build -t my-python ./docker/
    
  2. Затем прописал все сервисы в 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"
    
  3. И запустил бы всё разом командой docker compose up

Но если вам действительно нужно запускать контейнеры поштучно вручную, то команда такая:

docker run -it -v $PWD/app1:/dir --restart=always my-python \
       /usr/local/bin/python3 /dir/app  
→ Ссылка