如何在python脚本中提供sys.path到docker文件



>我添加了sys.path

sys.path.append("C:\Program Files\FME\fmeobjects\python27") 

在 Python 脚本中,当我运行脚本时效果很好。我不是在尝试对脚本进行码头化。我的码头工人脚本是

FROM python:2.7-alpine
ADD test1.py /
CMD [ "python", "./test1.py" ]

它构建映像,但在运行映像时会出错

Traceback (most recent call last):
File "./test1.py", line 17, in <module>
import fmeobjects
ImportError: No module named fmeobjects

您的脚本似乎无法导入 fmeobjects,因为它位于容器外部。尝试在添加的目录中添加 fme对象的导入。

test1.py做什么?

如果 fmeobjects 是一个包/模块,则需要如上所述添加到映像的环境中。

您还可以为它设置一个distutils,并且可以将其pip安装在映像中。

实际上,正如当前构造的那样,您正在尝试在脚本中导入一个不存在的包,因为它尚未安装。

即使对于小型独立应用程序,使用标准分发工具也可以显著简化此过程。 如果您的同事可能具有不同的用户名、目录布局甚至操作系统,则情况更是如此。 不要手动编辑脚本中的sys.path

您应该编写一个使用setuptools库的setup.py文件。 完整的文档在这里,但一个最小的示例可能如下所示:

#!/usr/bin/env python
from setuptools import setup, find_packages
setup(
name="fmeobjects",
version="0.1",
packages=find_packages(),
entry_points={
'console_scripts': [
'fmeobjects = fmeobjects.main:main'
]
}
)

对于开发用途,请创建一个虚拟环境并在其中安装包。

virtualenv vpy
. vpy/bin/activate
pip install -e .

. activate行为您设置了一些额外的环境变量,包括将虚拟环境添加到您的$PATH中。 (source是等效的供应商扩展,适用于某些 shell;.是标准的一部分,甚至可以在最小的外壳中工作,就像你在Alpine或Busybox安装中获得的那样。 现在可以在 shell 提示符下运行fmeobjects,这将在fmeobjects/main.py中调用main()函数(请参阅entry_points声明(。

你有几个选项可以在 Docker 中安装它。 可能最直接的是简单地导入源代码树并安装它。 由于 Docker 容器提供隔离的文件系统,并且通常只做一件事,因此在其中支持隔离的 Python 安装没有多大意义;只需将您的软件包安装到全局 Python 中即可。

FROM python:2.7
WORKDIR /usr/src/app
COPY . .
RUN pip install .
CMD ["fmeobjects"]

(如果您的虚拟环境位于源代码树中,则可以将vpy添加到.dockerignore文件中,使其不被复制,从而节省时间和空间。

最新更新