#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"]