在Docker容器中导入python文件

qmb5sa22  于 2023-06-22  发布在  Docker
关注(0)|答案(3)|浏览(221)

这一定是一个常见的问题,但我找不到合适的答案:在运行我的docker镜像时,我得到一个import错误:

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"]
svmlkihl

svmlkihl1#

在混乱之后,我通过在Dockerfile中设置PYTHONPATH env变量来运行容器:

ENV PYTHONPATH "${PYTHONPATH}:/app/"
laawzig2

laawzig22#

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语句是如何改变的。

piztneat

piztneat3#

您需要查看您在安装中使用的WORKDIR
看起来你试图从你的workdir执行脚本,但是你正在将数据复制到你的容器中的根文件夹。
创建你的docker,运行它并检查COPY命令中复制的文件是否在正确的文件夹中。
您可以运行docker compose exec <name of your container> ls并检查ls命令是否列出了您试图调用的文件夹。

相关问题