ModuleNotFoundError при копировании каталога хоста в контейнер в DockerFile - PullRequest
0 голосов
/ 01 апреля 2019

Я схожу с ума, пытаясь добавить каталог с моего хост-компьютера в мой док-контейнер.При сборке контейнера с помощью docker-compose up --build кажется, что ADD просто отлично, но когда я пытаюсь получить доступ к модулю в моем файле app.py, я получаю ModuleNotFoundError

Мой DockerFile содержит следующее:

FROM python:3.7-alpine

RUN apk update && \
    apk add --virtual build-deps gcc musl-dev && \
    apk add --no-cache postgresql-dev && \
    apk add alsa-lib-dev && \
    apk add pulseaudio-dev && \
    apk add postgresql-dev && \
    apk add ffmpeg-dev && \    
    apk add ffmpeg && \          
    rm -rf /var/cache/apk/*

COPY /scraper/requirements.txt requirements.txt
RUN pip install -r requirements.txt

ADD /common/testmodel /scraper/testmodel

WORKDIR home/scraper/

ENTRYPOINT ["python3", "-u", "app.py"]
CMD gunicorn -b 0.0.0.0:5000 --access-logfile - "app:app"

Затем при построении изображения журнал показывает:

Step 6/9 : ADD /common/testmodel home/scraper/testmodel
---> a7b27854d751

Моя структура проекта выглядит следующим образом:

-common
    -testmodel
        -test.py
-scraper
    -DockerFile
    -requirements
-docker-compose.yml

Но в моем приложении.Пи-файл, когда я запускаю from testmodel.test import TestClass, я получаю ModuleNotFoundError: No module named 'testmodel'

Любая помощь с этой проблемой очень ценится, так как теперь это заняло гораздо большую часть моего дня, чем я когда-либо думал.Большое спасибо.

1 Ответ

1 голос
/ 01 апреля 2019

Возможно, мне не хватает некоторого контекста, но я думаю, что у вас есть несколько проблем:

  • Вы COPY /scraper... и ADD /common... - эти каталоги висят от root на вашей локальной машине?
  • Вы устанавливаете WORKDIR после COPY и ADD, но, как правило (хотя и не обязательно), вы сначала установите это как пункт назначения по умолчанию, а затем вы можете COPY something . и ADD something . и эти пункты назначения (.) относится к вашему WORKDIR
  • . Вы используете /home/scraper в качестве WORKDIR, но вы не копируете и не добавляете в него свои файлы.В этот момент он будет пустым.
  • Ваши ENTRYPOINT ссылки app.py, но ваш файл называется test.py

Один полезный инструмент отладки - это оболочка в контейнеры, например:проверьте структуру каталогов, чтобы убедиться, что она соответствует ожиданиям.Предполагая, что ваше изображение называется scraper, вы можете:

docker build \
--tag=scraper \
--file=scraper/Dockerfile \
. # Don't forget the period ;-)

Тогда оболочка Alpine называется ash:

docker run \
--interactive \
--tty \
scraper:latest ash

Или, если ваш Dockerfile имеет ENTRYPOINT, затем переопределите его, используя:

docker run \
--interactive \
--tty \
--entrypoint=ash \
scraper:latest

и затем вы можете просмотреть структуру каталогов контейнера:

По умолчанию вы будете использовать /home/scraper (WORKDIR):

/home/scraper # ls -l
total 0

Вы можете проверить /scraper, используя:

/home/scraper # apk install tree
/home/scraper # tree /scraper
/scraper
└── testmodel
    └── test.py

1 directory, 1 file

Мне не совсем ясно, какое будет правильное решение для вас , но Надеюсь, это поможетВы прогрессировали:

FROM python:3.7-alpine

RUN apk update && \
    apk add --virtual build-deps gcc musl-dev && \
    apk add --no-cache postgresql-dev && \
    apk add alsa-lib-dev && \
    apk add pulseaudio-dev && \
    apk add postgresql-dev && \
    apk add ffmpeg-dev && \    
    apk add ffmpeg && \          
    rm -rf /var/cache/apk/*

WORKDIR home/scraper/

COPY scraper/requirements.txt .

RUN pip install -r requirements.txt

ADD common/testmodel .

ENTRYPOINT ["python3", "-u", "test.py"]
CMD gunicorn -b 0.0.0.0:5000 --access-logfile - "test:app"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...