Problem
Docker 镜像大小通常应尽可能小。使用成熟的环境,例如标准蟒蛇 https://hub.docker.com/_/python/安装了所有依赖项后,图像通常会导致图像严重膨胀。将 python 打包成独立的可执行文件(例如使用 pyinstaller)是减少图像大小和整体复杂性的完美方法。
环境: python3.6
, pyinstaller==3.4
出现的问题是,python 使用默认的缓冲 stdio。这可以通过运行 python 脚本来缓解python -u ...
。但使用 pyinstaller 时变得无法访问。
根据docs https://pyinstaller.readthedocs.io/en/v3.4/spec-files.html#giving-run-time-python-options应该可以添加运行时选项,例如u
, v
and W ...
到生成的可执行文件。但不幸的是,实际上它似乎不起作用。两个都,v
and W
,工作正常,但是u
似乎完全被忽略了。
以下代码片段显示了用法:
...
exe = EXE(...
[('u', None, 'OPTION')],
name="myapp",
...)
...
这面旗帜还有效吗?由于其他人的工作 - 它是否在没有通知或更新文档的情况下被删除?
是否有其他方法可以禁用 stdio 缓冲(使用 pyinstaller 或外部),without修改python代码,比如so https://stackoverflow.com/questions/107705/disable-output-buffering?
为什么需要这样?
运行 docker swarm 服务时,应避免缓冲 IO。为了使可执行文件正确地实时登录到docker守护进程,需要附加一个shell。但是,将 tty shell 附加到 swarm 任务使得处理日志变得非常非常复杂,甚至是不可能的。