docker打包python环境碰到系统依赖缺失而反复运行失败怎么解决。

把python环境打包到docker的时候碰到很多问题。
比如我在部署pyqt环境的时候,出现了很多requirements.txt以外的依赖。
比如这些:

sudo apt install pyqt5*
sudo apt-get install libxcb-xinerama0 libxcb-xinerama0-dev
export QT_QPA_PLATFORM=xcb
pip uninstall opencv-python
pip install opencv-python-headless

上面那些是我在wsl2的ubuntu里摸索出来并且让程序成功启动需要的依赖。
但是我不能一次性确定到底缺少哪些依赖,对于docker每次构建完运行一次才报错,效率很低。【python环境构建真的超慢,一次十分钟】。
这个怎么破。
wsl2:ubuntu-22.04,
docker:python:3.10-slim。

docker已经打包不下十次了,每次报错都不同。另外,这个错误不是打包镜像时候报错的,都是运行容器的时候才会报错。

比如这样的:

gt.qpa.xcb:could not connect to display
qt.qpa.plugin:Could not load the Qt platform plugin "xcb"in "even though it was found.
This application failed to start because no Qt platform plugin could be initialized.Reinstalling the application may fix this problem.
Available platform plugins are:eglfs,linuxfb,minimal,minimalegl,offscreen,vnc,wayland-egl,wayland,w
ayland-xcomposite-egl,wayland-xcomposite-glx,webgl,xcb.
1 个赞

每次都是python执行的时候才会抛出错误。每次都是pyqt,真的会爆炸。

起一个容器,在容器里把每一步都成功后 写Dockerfile 打包

5 个赞

考不考率使用conda之类的工具,yaml文件中版本号,镜像源直接就会写死。基本没有这个问题。可以使用miniconda减少体积

用conda 体积小不了

存储量增加,换来的是过程更加简单,环境配置文件写好以后只需要一行 conda env create 配置文件,我认为还是值得的。

1 个赞

好方法, py里面很多隐式调用 还是得手动档稳妥

学习知识了 :heart_eyes:

后面发现是我太蠢了。

wsl2是支持直接把运行的程序窗口显示到windows系统上的。也就是说显示源是配置好的。而docker没有wsl那么方便,没有专门连接到windows显示源。后面我自己在容器里配的时候,就缺一个XServer,缺一个显示目标,终端本身没有不支持GUI,所以一直运行不起来。

我在这里看见了一个老哥构建pyqt docker镜像的案例,需要特地映射到windows的显示设备,太麻烦了。不如浏览器+后端架构。

所以pyqt也挺鸡肋的。我可以去再学学vue+python或者干脆丢了python用其他的,python打包太大了。

如果是网络原因的话,我建议你可以开个临时境外服务器,docker打包完成后释放掉。如果是过程中报错建议采用

过程报错,这个方法很好,我就是这么排查的。后面发现是linux无GUI的终端形式不支持XServer,而映射到windows太麻烦了。【wsl2这块是都做好了的】

后面我打算改用网页端+后端的形式,这样避免了直接的gui显示。

我之前在做doker 镜像打包的时候,总是会遇到依赖无法安装,缺这个少那个的情况,都是一步一步,开个容器,成功一个记一个,再然后就是把弄好的镜像直接打个基础镜像,再次打包,也不用走重新构建镜像这一步了。

1 个赞