docker-compose python:无法打开文件“./main.py”:[Errno 2]没有这样的文件或目录

D.B*_*ick 4 docker dockerfile docker-compose docker-for-windows

这是我的 Dockerfile:

\n\n
FROM python:3.8-slim\n\nWORKDIR /proxy-scraper-checker-master\n\nRUN apt-get update && \\\n    apt-get install -y --no-install-recommends libc-dev\n\nCOPY requirements.txt requirements.txt\nRUN pip install -r requirements.txt\n\nCOPY . /proxy-scraper-checker-master\nCMD [ "python", "main.py" ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的 docker-compose.yml:

\n\n
version: "3.3"\n\nservices:\n    proxy-app:\n        build:\n            context: .\n            dockerfile: Dockerfile\n        container_name: proxy-app\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的项目目录的结构(我从中运行 docker 命令):

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 proxy-scraper-checker-master\n     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

docker-compose up

\n
\n\n

我收到以下错误消息:

\n\n
C:\\Projects\\myprojects\\docker-example>docker-compose up\nCreating proxy-app ... done\nAttaching to proxy-app\nproxy-app    | python: can\'t open file \'./main.py\': [Errno 2] No such file or directory\nproxy-app exited with code 2\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Jak*_*kub 9

问题出在线路上。

COPY . /proxy-scraper-checker-master
CMD [ "python", "main.py" ]
Run Code Online (Sandbox Code Playgroud)

您将整个目录复制到 中/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
Run Code Online (Sandbox Code Playgroud)

至此,我们已经找到了路径main.py。为了解决原来的问题,我们可以将CMDDockerfile 中的 更改为以下内容:

CMD [ "python", "/proxy-scraper-checker-master/proxy-scraper-checker-master/main.py" ]
Run Code Online (Sandbox Code Playgroud)

我们可以改进 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" ]
Run Code Online (Sandbox Code Playgroud)

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