将Windows环境变量传递给dockerized python应用程序

时间:2020-11-07 13:42:24

标签: python docker environment-variables

我正在运行一个python应用程序,该应用程序从Windows env vars读取两个路径,并继续使用这些路径中的可执行文件对某些文档进行OCR。由于Windows中已经设置了POPPLER,TESSERACT env var,因此此Python代码段对我有用:

popplerPath = os.environ.get('POPPLER')
tesseractPath = os.environ.get('TESSERACT')

现在,我正在尝试对应用程序进行docker化,据我所知,由于我的容器需要访问这些路径,因此我需要在运行期间使用VOLUME挂载它们。我的dockerfile看起来像这样:

FROM python:3.7.7-slim
WORKDIR ./
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY documents/ .
COPY src/ ./src
CMD [ "python", "./src/run.py" ] 

我使用以下图像构建图像:

docker build -t ocr .

然后我尝试使用以下命令运行容器:

docker run -v %POPPLER%:%POPPLER% -v %TESSERACT%:%TESSERACT% ocr

...但是我的应用程序仍然为这些路径获取None值,并且无法使用可执行文件。我的方法正确吗?除此之外,这是一种好的开发实践吗?

2 个答案:

答案 0 :(得分:2)

请参见doc,环境变量的开关为-e

$ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash

,并且在dockerfile中,您可以使用

ENV FOO=/bar

如果我正确理解了您的陈述,那么您的路径将与主机安装在容器中的路径相同。唯一的问题是您的Python脚本,该脚本希望环境变量提供路径。除非您将它们从主机系统传递到容器系统,否则它将不存在。

使用-v验证安装的卷正确后,您可以尝试

docker run -v %POPPLER%:%POPPLER% -v %TESSERACT%:%TESSERACT% --env POPPLER=%POPPLER% --env TESSERACT=%TESSERACT% ocr

或者,如果您始终运行此命令,则可以考虑将它们放入dockerfile中以保存一些击键。

答案 1 :(得分:0)

您调用的任何可执行文件都必须内置在映像中。容器通常不能在主机或其他容器中调用可执行文件。在显示的特定示例中,即使您确实使用绑定安装将Linux容器注入到容器中,Linux容器也无法运行Windows可执行文件。

“苗条” python images建立在Debian GNU / Linux上,您需要使用其APT工具将这些可执行文件依赖项安装在Dockerfile中。 (https://www.debian.org/distrib/packages有一个搜索框,可帮助您找到正确的软件包名称; Ubuntu Linux也使用Debian软件包。)

FROM python:3.7-slim
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install -y \
      popper-utils \
      tesseract-ocr-all
COPY requirements.txt .
...

如果未设置这些环境变量,我建议在代码中放入合理的默认值。 apt-get install命令会将它们放入映像内的系统路径。

popplerPath = os.environ.get('POPPLER', 'poppler')
tesseractPath = os.environ.get('TESSERACT', 'tesseract')

如果您确实需要它们作为环境变量,则可以使用Dockerfile ENV指令

ENV POPPLER=poppler TESSERACT=tesseract

主机的环境变量不会自动传递到容器中;您需要一个Dockerfile ENVdocker run -e选项。还请记住,容器具有隔离的文件系统(Windows语法路径在Linux容器中没有意义),因此这些环境变量将需要是容器路径,这是建议的docker run -v选项的后半部分。