Ani*_*tel 6 python docker dockerfile
当在本地导入 python 模块时,我能够成功地做到这一点,但是在对应用程序进行 Docker 化时我很难做到这一点。似乎我在本地得到的行为与进入 docker 应用程序的行为相反......有什么想法吗?
我有以下目录结构
| app
| |api.py
| |settings.py
| tests
| |test_api.py
Run Code Online (Sandbox Code Playgroud)
在 api.py 中,我通过以下方式导入设置:
from app import settings
在 test_api.py 中,我通过以下方式导入 app.py:from app import api。
在本地,一切正常。当我尝试使用以下 Dockerfile 对该 API 进行 dockerize 时:
FROM python:3.8.5-alpine
RUN pip install pipenv
COPY Pipfile /usr/src/
WORKDIR /usr/src
RUN pipenv lock --requirements > requirements.txt
RUN pip install -r requirements.txt
COPY app /usr/src/app
WORKDIR /usr/src/app
CMD ["python", "api.py"]
Run Code Online (Sandbox Code Playgroud)
docker 镜像构建成功,但是在运行容器时,出现以下错误:
File "api.py", line 4, in <module>
from app import settings
ModuleNotFoundError: No module named 'app'
Run Code Online (Sandbox Code Playgroud)
如果我将 api.py 中的导入方式更改为import settings,我会在本地收到错误,但 docker 容器可以正常工作。我很确定这与 PythonPath 有关,关于如何解决这个问题有什么想法吗?
我刚刚在 StackOverflow 上发现了另一个线程,它似乎已经解决了我的问题。我可以保留上面在我的问题中指出的导入语句,并且通过正确设置 docker 容器中的 PYTHONPATH,我能够使导入在 docker 中正常工作。
如何在 Dockerfile 中添加 PYTHONPATH 路径
我更新的(工作的)Dockerfile 如下:
FROM python:3.8.5-alpine
RUN pip install pipenv
COPY Pipfile /usr/src/
WORKDIR /usr/src
RUN pipenv lock --requirements > requirements.txt
RUN pip install -r requirements.txt
COPY app /usr/src/app
ENV PYTHONPATH "${PYTHONPATH}:/usr/src/app"
CMD ["python", "app/api.py"]
Run Code Online (Sandbox Code Playgroud)
小智 1
您的工作目录是 /usr/src/app 并且 import 语句尝试查找目录“app”。如果将工作目录更改为 /usr/src/。
或者,您可以通过以下方式直接导入设置:
import settings
Run Code Online (Sandbox Code Playgroud)
代替
from app import settings
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14259 次 |
| 最近记录: |