docker-compose python:无法打开文件'./main.py':[Errno 2] 没有那个文件或目录。

4
这是我的Dockerfile文件:
FROM python:3.8-slim

WORKDIR /proxy-scraper-checker-master

RUN apt-get update && \
    apt-get install -y --no-install-recommends libc-dev

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

COPY . /proxy-scraper-checker-master
CMD [ "python", "main.py" ]

这是我的docker-compose.yml文件:
version: "3.3"

services:
    proxy-app:
        build:
            context: .
            dockerfile: Dockerfile
        container_name: proxy-app

这是我项目目录的结构(我在其中运行我的Docker命令):

├── docker-compose.yml
├── Dockerfile
├── requirements.txt
├── proxy-scraper-checker-master
     └── main.py

在上述目录下运行以下命令时:

docker-compose up

我遇到了以下错误信息:
C:\Projects\myprojects\docker-example>docker-compose up
Creating proxy-app ... done
Attaching to proxy-app
proxy-app    | python: can't open file './main.py': [Errno 2] No such file or directory
proxy-app exited with code 2

能否有人指导我做错了什么?

1个回答

9
问题出在这些代码行中。
COPY . /proxy-scraper-checker-master
CMD [ "python", "main.py" ]

您正在将整个目录复制到 /proxy-scraper-checker-master 中,因此您的 main.py 文件将位于 /proxy-scraper-checker-master/proxy-scraper-checker-master/main.py

为了调试此代码,您可以在容器内输入一个 bash 终端,并查看目录结构以找到 main.pydocker-compose 已经构建了镜像,所以您可以使用 docker images 命令找到镜像名称,或者重新构建镜像。

jakub@dash:/tmp/so$ docker build --tag my_python .
jakub@dash:/tmp/so$ docker run --rm -it my_python bash
# At this point, we are inside the Docker container.
root@924a7f854119:/proxy-scraper-checker-master# pwd
/proxy-scraper-checker-master
root@924a7f854119:/proxy-scraper-checker-master# ls
Dockerfile  docker-compose.yml  proxy-scraper-checker-master  requirements.txt
root@924a7f854119:/proxy-scraper-checker-master# realpath proxy-scraper-checker-master/main.py 
/proxy-scraper-checker-master/proxy-scraper-checker-master/main.py

目前,我们已经找到了main.py的路径。为了修复原始问题,我们可以将Dockerfile中的CMD更改为以下内容:

CMD [ "python", "/proxy-scraper-checker-master/proxy-scraper-checker-master/main.py" ]

我们可以改进 Dockerfile 文件,以删除多余的 COPY 指令。在下面的 Dockerfile 中,main.py 的绝对路径为 /app/proxy-scraper-checker-master/main.py。由于我们目前在 /app 目录(感谢 WORKDIR 指令),因此我们可以使用相对路径 proxy-scraper-checker-master/main.py 引用它。我们也可以使用绝对路径引用它。
FROM python:3.8-slim

RUN apt-get update && \
    apt-get install -y --no-install-recommends libc-dev

WORKDIR /app

COPY . .

RUN pip install --no-cache-dir -r requirements.txt

CMD [ "python", "proxy-scraper-checker-master/main.py" ]

我建议阅读COPY文档以了解其行为。


谢谢回复,但我尝试了这两个更改,错误仍然存在。 - Danny
将Shell进入您的容器,查看main.py文件所在位置。 - jkr
我对Docker还比较陌生,鉴于我的容器甚至无法运行,您能告诉我如何操作吗? - Danny
我已将您的答案标记为正确答案, 并且确实如此。您通过Bash调试引导我找到了解决问题的正确路径。同时,我也采纳了您对Dockerfile配置的建议,因为它更加合理,并且层数更少。再次感谢! - Danny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接