>我添加了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
文件中,使其不被复制,从而节省时间和空间。