在Docker容器中导入python文件

时间:2019-11-11 16:01:04

标签: python docker

我正在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

3 个答案:

答案 0 :(得分:1)

创建dockerfile时,实际上是将软件包(闻起来像一个软件包,具有__init__.py__main__.py的包)从“ src”重命名为“ vdp”。

我建议:

  • src/...重命名为src/vdp/...(或vdp/...) –此时,您应该能够在主机上的python -m vdp目录中运行src,并且一切正常。
  • 将Dockerfile节更改为
    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