将主机目录复制到DockerFile中的容器时出现ModuleNotFoundError

时间:2019-03-31 22:30:54

标签: docker

尝试将目录从主机添加到Docker容器时,我发疯了。当使用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

但是在我的app.py文件中,当我运行from testmodel.test import TestClass时,我得到了ModuleNotFoundError: No module named 'testmodel'

任何帮助解决此问题的人都将受到极大的赞赏,因为这是我现在曾经想过的大部分工作。非常感谢。

1 个答案:

答案 0 :(得分:1)

我可能缺少一些背景信息,但我认为您有几个问题:

  • COPY /scraper...ADD /common... –这些目录是从本地计算机上的根目录挂起的吗?
  • 您在WORKDIRCOPY之后设置了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/scraperWORKDIR):

/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"