运行我的 docker 映像时,出现导入错误:
File "./app/main.py", line 8, in <module>
import wekinator
ModuleNotFoundError: No module named 'wekinator'`
如何在 Docker 中导入本地 python 模块? COPY 命令不会复制整个“app”文件夹(包括两个文件),从而保留正确的导入位置吗?
.
├── Dockerfile
├── README.md
└── app
├── main.py
└── wekinator.py
FROM python:3.7
RUN pip install fastapi uvicorn python-osc
EXPOSE 80
COPY ./app /app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
经过多次困惑,我通过在 Dockerfile 中设置 PYTHONPATH 环境变量来运行容器:
ENV PYTHONPATH "${PYTHONPATH}:/app/"
将
PYTHONPATH
设置为这样可以,但感觉很笨拙:
ENV PYTHONPATH "${PYTHONPATH}:/app/"
使用 Docker 的
WORKDIR
可以提供更干净的解决方案:
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"]
注意
COPY
语句如何变化。
您需要查看您在安装时使用的是哪个
WORKDIR
。
似乎您正在尝试从工作目录执行脚本,但您正在将数据复制到容器内的根文件夹。
创建你的docker,运行它并检查在
COPY
命令中复制的文件是否位于正确的文件夹中。
您可以运行
docker compose exec <name of your container> ls
来执行此操作,并检查 ls
命令是否列出了您尝试调用的文件夹。