【问题标题】:docker-compose python: can't open file './main.py': [Errno 2] No such file or directorydocker-compose python:无法打开文件'./main.py':[Errno 2]没有这样的文件或目录
【发布时间】:2020-05-29 13:03:21
【问题描述】:

这是我的 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

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

码头工人组成

我收到以下错误消息:

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

有人可以指导我做错了什么吗?

【问题讨论】:

    标签: docker docker-compose dockerfile docker-for-windows


    【解决方案1】:

    问题出在线路上。

    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。我们可以使用相对路径proxy-scraper-checker-master/main.py 来引用它,因为我们目前在/app 中(感谢WORKDIR 指令)。我们也可以用绝对路径引用它。

    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 documentation 以了解其行为。

    【讨论】:

    • 感谢您的回复,但我尝试了两种更改,但错误仍然存​​在
    • Shell 到您的容器中,查看您的 main.py 文件在哪里。
    • 我是 docker 新手,请问我该怎么做,因为我的容器甚至无法运行?
    • 我将您的答案标记为正确,确实如此。您通过 bash 调试将我引导到解决问题的正确路径。我还调整了您对 Dockerfile 配置的建议,因为它更有意义,并且层数更少。再次感谢!
    最近更新 更多