问题
Docker镜像大小通常应尽可能小。使用完整的环境,例如标准Python镜像,在安装所有依赖项后会导致显着膨胀的镜像。将Python打包成独立的可执行文件(例如使用pyinstaller)是减小镜像大小和整体复杂性的完美方法。
环境: python3.6
, pyinstaller==3.4
出现的问题是,Python默认使用缓冲stdio。这可以通过使用python -u ...
运行Python脚本来缓解。但是在使用pyinstaller时变得无法访问。
根据文档,应该可以添加运行时选项,例如u
、v
和W...
到生成的可执行文件中。但不幸的是,在实际情况中似乎不起作用。虽然v
和W
都正常工作,但u
似乎被完全忽略了。
以下代码段显示了用法:
...
exe = EXE(...
[('u', None, 'OPTION')],
name="myapp",
...)
...
这面旗帜仍然有效吗?由于其他的工作 - 它已经被删除了,但没有通知或更新文档吗?
有没有其他方法可以禁用stdio缓冲(使用pyinstaller或外部方式),而不需要修改Python代码,就像这样?
为什么需要这样做?
在运行Docker Swarm服务时应避免使用缓冲IO。为了使可执行文件实时记录到Docker守护程序中,需要附加一个shell。但是向Swarm任务附加tty shell会使日志处理变得更加复杂,甚至可能无法正常工作。