Dockerfile: 无法打开文件 './main.py': [Errno 2] 没有那个文件或目录

时间:2021-02-27 19:30:45

标签: 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.我尝试了一切,我开始怀疑错误出在其他地方

3 个答案:

答案 0 :(得分:0)

/src/main.py 是系统根目录的绝对路径。

为了与您当前的目录相关,请使用 ./src/main.py

答案 1 :(得分:0)

我将简化您的 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"]

答案 2 :(得分:0)

问题是您有多阶段构建(2x FROM),而您只将它们添加到第一阶段。


FROM python:3.9-slim AS compile

[..]

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

FROM python:3.9-slim AS build

[..]

您可以在 2. 阶段使用第二个 COPY --from= 语句解决此问题。 另外你的 CMD 是错误的。要么给它完整路径,要么用 .目录/文件名(/my-app/src/main.py./src/main.pysrc/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

最后,您只在丢弃的阶段设置工作目录,但这仅在您没有为 cmd 提供完整路径或需要特定工作目录时才相关。