docker-compose python: 无法打开文件 './main.py': [Errno 2] 没有那个文件或目录
docker-compose python: can't open file './main.py': [Errno 2] No such file or directory
这是我的 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
有人可以指导我做错了什么吗?
问题出在行上。
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
的路径。要解决原始问题,我们可以将 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 以了解其行为。
这是我的 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
有人可以指导我做错了什么吗?
问题出在行上。
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
的路径。要解决原始问题,我们可以将 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 以了解其行为。