【发布时间】:2018-09-12 19:44:49
【问题描述】:
问题
Docker 映像大小通常应尽可能小。使用像standard python 图像这样的成熟环境通常会在严重臃肿的图像中安装所有依赖项。将 python 打包成独立的可执行文件(例如使用 pyinstaller)是减少图像大小和整体复杂性的完美方法。
环境:python3.6、pyinstaller==3.4
出现的问题是,python 使用默认缓冲的 stdio。这可以通过使用python -u ... 运行 python 脚本来缓解。但是在使用 pyinstaller 时变得无法访问。
根据docs,应该可以向生成的可执行文件添加运行时选项,例如u、v 和W ...。但不幸的是,实际上它似乎不起作用。 v 和 W 都可以正常工作,但 u 似乎完全被忽略了。
下面的sn-p显示用法:
...
exe = EXE(...
[('u', None, 'OPTION')],
name="myapp",
...)
...
这个标志仍然有效吗?由于其他人工作 - 它是否在没有通知或更新文档的情况下被删除?
是否有其他方法可以禁用 stdio 的缓冲(使用 pyinstaller 或在外部),无需修改 python 代码,如so?
为什么需要这样做?
在运行 docker swarm 服务时要避免缓冲 IO。为了使可执行文件正确地实时登录到 docker 守护进程,有必要附加一个 shell。但是,将 tty shell 附加到 swarm 任务上使得处理日志变得更加复杂,甚至不可能。
【问题讨论】:
标签: python docker pyinstaller stdio