在 Docker 容器中导入 python 文件

msa*_*lla 6 python python-import docker

运行我的 docker 映像时,出现导入错误:

\n
File "./app/main.py", line 8, in <module>\nimport wekinator\nModuleNotFoundError: No module named 'wekinator'`\n
Run Code Online (Sandbox Code Playgroud)\n

如何在 Docker 中导入本地 python 模块?COPY 命令不会复制整个“app”文件夹(包括两个文件),从而保留正确的导入位置吗?

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wekinator.py\n
Run Code Online (Sandbox Code Playgroud)\n
FROM python:3.7\n\nRUN pip install fastapi uvicorn python-osc\n\nEXPOSE 80\n\nCOPY ./app /app\n\nCMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]\n
Run Code Online (Sandbox Code Playgroud)\n

msa*_*lla 9

经过一番困惑后,我通过在 Dockerfile 中设置 PYTHONPATH 环境变量来运行容器:

ENV PYTHONPATH "${PYTHONPATH}:/app/"
Run Code Online (Sandbox Code Playgroud)


小智 3

这样设置PYTHONPATH是可行的,但感觉很笨拙:

ENV PYTHONPATH "${PYTHONPATH}:/app/"
Run Code Online (Sandbox Code Playgroud)

使用 DockerWORKDIR可以提供更简洁的解决方案:

FROM python:3.7

WORKDIR /code

RUN pip install fastapi uvicorn python-osc

EXPOSE 80

COPY app ./app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
Run Code Online (Sandbox Code Playgroud)

请注意声明是如何COPY改变的。