我正在运行一个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值,并且无法使用可执行文件。我的方法正确吗?除此之外,这是一种好的开发实践吗?
答案 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 ENV
或docker run -e
选项。还请记住,容器具有隔离的文件系统(Windows语法路径在Linux容器中没有意义),因此这些环境变量将需要是容器路径,这是建议的docker run -v
选项的后半部分。>