我正在docker容器内执行一个python文件,并且需要将我放置的所有功能导入一个名为base_functions
的单独python文件中。但是,即使from base_functions import *
与主python文件位于同一目录中,编写ModuleNotFoundError: No module named 'base_functions'
也会引发错误,即base_functions.py
。我怎样才能做到这一点?我是否需要在settings.ini或其他内容中指定要预先导入的python脚本?
这是Dockerfile的内容:
FROM amancevice/pandas:0.24.1-alpine
RUN apk update
RUN apk add build-base
RUN apk add gcc musl-dev libc-dev util-linux-dev linux-headers python3-dev postgresql-libs postgresql-dev git libffi-dev libmemcached-dev zlib-dev \
ca-certificates zlib-dev jpeg-dev freetype-dev libpng
RUN pip3 install --upgrade pip
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY src /vdp
WORKDIR /
ENTRYPOINT ["python3", "-m", "vdp"]
这些都是项目目录中的所有文件:
/home/cr/docker/71119/.
├── docker-compose.yaml
├── Dockerfile
├── Makefile
├── README.md
├── requirements.txt
├── settings.ini
└── src
├── base_functions.py
├── influx.py
├── __init__.py
└── __main__.py
答案 0 :(得分:1)
创建dockerfile时,实际上是将软件包(闻起来像一个软件包,具有__init__.py
和__main__.py
的包)从“ src”重命名为“ vdp”。
我建议:
src/...
重命名为src/vdp/...
(或vdp/...
)
–此时,您应该能够在主机上的python -m vdp
目录中运行src
,并且一切正常。COPY src /src
WORKDIR /src
ENTRYPOINT ["python3", "-m", "vdp"]
另一种选择是将/src
放到存储库中,然后将其更改为COPY vdp /src/vdp
。
当然,第三个选择是设置适当的Python封装,让setup.py
建立适当的轮子,然后将其安装在Docker容器中。
答案 1 :(得分:1)
您需要提及PYTHONPATH。在您的Dockerfile中,我将假设您的根目录为/home/cr/docker/71119/src/
env PYTHONPATH /home/cr/docker/71119/src/
或者,或者如果您希望它正常工作(我偏爱调试)
docker run -it <img-name> /bin/bash
export PYTHONPATH=/home/cr/docker/71119/src/ && python3 <your-script>.py
,它应该可以工作。
另一个提示是,如果要显示文件结构,请通过以下方式安装树:apt-get install tree -y && cd <your-dir> && tree
,然后将其发布到SO。只是更干净!
答案 2 :(得分:0)
Python无法找到base_functions文件,因为它是从其他文件夹运行的。
您可能要更改Dockerfile中的工作目录:
WORKDIR /path/to/workdir