我添加了sys.path
sys.path.append("C:\\Program Files\\FME\\fmeobjects\\python27")
在python脚本中,当我运行该脚本时,该脚本运行得很好。我并不是想要dockerize这个脚本。我的docker脚本是
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
发布于 2018-08-19 03:20:37
看起来你的脚本不能导入fmeobjects,因为它在容器之外。尝试在您添加的目录中添加fmeobjects的导入。
发布于 2018-08-19 03:42:14
test1.py
是做什么的?
如果fmeobjects是一个包/模块,则需要如上所述添加到镜像环境中。
您还可以为它设置distutils,并且可以在映像中通过pip安装它。
实际上,正如当前构造的那样,您正在尝试导入脚本中不存在的包,因为它尚未安装。
发布于 2018-08-19 05:45:48
即使对于小型独立应用程序,使用标准分发工具也可以显著简化此过程。如果您的同事可能具有不同的用户名、目录布局甚至操作系统,则更是如此。不要在脚本中手动编辑sys.path
。
您应该编写一个使用setuptools
库的setup.py
文件。Complete documentation is here,但最小的示例可能如下所示:
#!/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'
]
}
)
对于开发用途,创建一个virtual environment并在其中安装您的包。
virtualenv vpy
. vpy/bin/activate
pip install -e .
. activate
行为您设置一些额外的环境变量,包括向您的$PATH
添加虚拟环境。(source
是一个等效的供应商扩展,可以在某些shell中工作;.
是标准的一部分,甚至可以在最小的shell中工作,就像您在阿尔卑斯山或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"]
(如果您的虚拟环境在源代码树中,您可以在.dockerignore
文件中添加vpy
,使其不被复制,从而节省时间和空间。)
https://stackoverflow.com/questions/51911765
复制相似问题