docker -compose python: невозможно открыть файл './main.py': [Errno 2] Нет такого файла или каталога - PullRequest
1 голос
/ 29 мая 2020

Это мой 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 - составить

Я получаю следующее сообщение об ошибке:

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 Ответ

1 голос
/ 29 мая 2020

Проблема в строках.

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.

To отладите это, вы можете ввести терминал 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 документацию , чтобы понять его поведение.

...