Dockerfile: не удается открыть файл ‘./main.py ‘: [Ошибка 2] Нет такого файла или каталога

#python #docker

#python #docker

Вопрос:

Я получаю эту ошибку: python: can't open file '/src/main.py': [Errno 2] No such file or directory когда я пытаюсь запустить контейнер с изображением, которое было создано со следующим файлом docker:

 FROM python:3.9-slim AS compile

RUN python -m venv /opt/venv

ENV PATH="/opt/venv/bin:$PATH"

WORKDIR /my-app

COPY requirements.txt .
RUN pip install -r requirements.txt

ADD src/ ./src
RUN pip install .

FROM python:3.9-slim AS build

COPY --from=compile/opt/venv /opt/venv

ENV PATH="/opt/venv/bin:$PATH"

CMD ["python", "/src/main.py"]
 

Я тоже попробовал это, и он по-прежнему выдает мне ошибку того же типа о том, что не найден main.py : я пробовал ./src/main/py, /src/main.py , /src/main.py , ./main.py . Я перепробовал все, я начинаю подозревать, что ошибка в другом месте

Комментарии:

1. В вашем изображении есть только вещи после последней FROM строки. Не похоже, что что-либо, в чем вы COPY находитесь, включает каталог с именем src в корне файловой системы или где-либо еще.

Ответ №1:

Проблема в том, что у вас многоступенчатая сборка (2 раза ИЗ), и вы добавляете их только на первом этапе.

 
FROM python:3.9-slim AS compile

[..]

ADD src/ ./src
ADD setup.py .
RUN pip install .

FROM python:3.9-slim AS build

[..]
 

Вы можете исправить это с помощью второго COPY --from= оператора в 2. stage.
Кроме того, ваш CMD неверен. Либо укажите полный путь, либо начните относительный путь с a . каталог-/filename ( /my-app/src/main.py , ./src/main.py , src/main.py ).

 FROM python:3.9-slim AS compile

RUN python -m venv /opt/venv

ENV PATH="/opt/venv/bin:$PATH"

WORKDIR /my-app

COPY requirements.txt .
RUN pip install -r requirements.txt

ADD src/ ./src
ADD setup.py .
RUN pip install .

FROM python:3.9-slim AS build

COPY --from=compile/opt/venv /opt/venv

COPY --from=compile/my-app /my-app                  # ADDED

WORKDIR /my-app                                     # ADDED

ENV PATH="/opt/venv/bin:$PATH"

CMD ["python", "/my-app/src/main.py"]                      # FIXED
 

Наконец, вы устанавливаете workdir только на этапе, который вы отбрасываете, но это актуально только в том случае, если вы не указываете cmd полный путь или вам нужен конкретный workdir.

Ответ №2:

/src/main.py это абсолютный путь от корня системы.

Для того, чтобы быть относительно вашего текущего каталога, используйте ./src/main.py

Комментарии:

1. когда вы запускаете exec -it bash свой docker, вы видите src/main.py ?

2. вы видите другие файлы в src?

Ответ №3:

Я бы упростил ваш файл docker, как показано ниже:

     # base image
    FROM amazonlinux:1
    
    # Set the working directory
    WORKDIR /app
    
    # Copy the current directory contents into the container at /app
    COPY . /app
    
    # Install requirements
    RUN pip install -r requirements.txt
    
    # Define environment variable
    ENV PYTHONPATH "${PYTHONPATH}:/app"

    # Run main.py when the container launches
    ENTRYPOINT ["python", "-u", "src/main.py"]