PYTHONPATH的Docker镜像和ENV命令:即使本地运行正常,也找不到模块

时间:2018-03-15 17:50:01

标签: python docker pythonpath

我有一个Python作业,我正试图在Docker镜像中发布。代码的结构使得某些模块从modules文件夹导入,因此我已添加到Python路径中。

具体来说,Dockerfile是

FROM python:3

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app

ENV PYTHONPATH "/usr/src/app"

RUN pip3 install -r requirements.txt

正如您所看到的,我正在尝试为PYTHONPATH设置环境变量,以便它可以在同一工作目录中找到内容。

要运行的脚本称为main.py,当我在本地运行时(不是从docker)运行

PYTHONPATH=$PYTHONPATH:$HOME/job-path python3 main.py

运行正常。

有了这个Dockerfile,在构建我从docker inspect <ID>获得的图像后,Env字段包含

"Env": [
            "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "LANG=C.UTF-8",
            "PYTHON_VERSION=3.6.4",
            "PYTHON_PIP_VERSION=9.0.1",
            "PYTHONPATH=/usr/src/app"
        ]

所以它看起来很好吗?但docker run给了我一个

ModuleNotFoundError: No module named 'modules'

2 个答案:

答案 0 :(得分:0)

这里的问题是,您复制到__init__.py的src文件夹中可能没有/usr/src/app。这就是为什么modules软件包未被识别的原因。您可以将__init__.py添加到您的src文件夹中,也可以将modules添加到PYTHONPATH

ENV PYTHONPATH "/usr/src/app/:/usr/src/app/modules/"

请注意,如果您的modules文件夹包含子文件夹,则它还应包含__init__.py

答案 1 :(得分:0)

语法是

$data = Data::firstOrCreate([
       'bulan' => $bulan,
       'tahun' => $tahun,
       'nama_pkp'  => $v["nama_pkp"],
       'keterangan'=> $v["keterangan"],
       'no_faktur_pajak'   => $v["no_faktur_pajak"],
       'tgl_faktur_pajak'  => $tgl_faktur_pajak_format,
       'ref'   => $v["ref"],
       'dpp'   => $v["dpp"],
       'ppn'   => $ppn,
       'invoice_no'=> $v["invoice_no"],
       'nama_tenant'   => $v["nama_tenant"],
       'pph_4_deyon'   => $v["pph_4_deyon"],
       'pph_4_tenant'  => $v["ppn"],
       'no_p_l_tenant' => $v["no_potong_dan_lapor_tenant"],
       'bukpot_oleh_tenant'=> $v["bukti_potong_oleh_tenant"],
       'tgl_p_l_penyewa'   => $tgl_p_l_penyewa_format,
       'pph_p_l_tenant'=> $v["pph_potong_dan_lapor_tenant"],
       'note'  => $v["note"],
       'checklist' => $v["checklist"],
       'selisih'   => $selisih
]);

没有等号,您将创建两个空变量;第二个的名称是ENV variable1[=value1] variable2[=value2] ... 。你想要

/usr/src/app

在变量名称和其值之间带有等号。

如果要附加到现有值,则可以:

ENV PYTHONPATH="/usr/src/app"