首页 > 解决方案 > docker-compose python:无法打开文件'./main.py':[Errno 2]没有这样的文件或目录

问题描述

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

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

标签: dockerdocker-composedockerfiledocker-for-windows

解决方案


问题出在线路上。

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.py. docker-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。要修复原始问题,我们可以CMD将 Dockerfile 中的更改为以下内容:

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


推荐阅读