尝试将目录从主机添加到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'
任何帮助解决此问题的人都将受到极大的赞赏,因为这是我现在曾经想过的大部分工作。非常感谢。
答案 0 :(得分:1)
我可能缺少一些背景信息,但我认为您有几个问题:
COPY /scraper...
和ADD /common...
–这些目录是从本地计算机上的根目录挂起的吗?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"