因此,我有一个基于 Qt5 的 C++ GUI,我想从 Docker 容器内运行它。
当我尝试开始时
docker run --rm -it my_image
Run Code Online (Sandbox Code Playgroud)
这会导致错误输出
qt.qpa.xcb: could not connect to display localhost:10.0
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, xcb.
Run Code Online (Sandbox Code Playgroud)
所以我寻找如何做到这一点。我在 docker 容器中找到了 GUI Qt 应用程序,并基于此调用它
QT_GRAPHICSSYSTEM="native" docker run -it …Run Code Online (Sandbox Code Playgroud) 我有一个 dockerfile,当我想构建时会导致错误
E: You don't have enough free space in /var/cache/apt/archives/
Run Code Online (Sandbox Code Playgroud)
请注意,该图像设置了一个稍微复杂的项目,其中包含多个需要大量空间的依赖项。例如,该列表包括 Qt。这只是图像构建过程中的事情,最后,我预计它的大小可能为 300 MB。
现在我发现了这个:https : //unix.stackexchange.com/questions/578536/how-to-fix-e-you-dont-have-enough-free-space-in-var-cache-apt-archives
鉴于此,到目前为止我尝试过的是:
docker system prunesudo apt autoremove和删除不需要的安装文件sudo apt autocleanvar/log,目前的大小为 3 GB。但是,我不是系统管理员,所以做这种事情很谨慎。有没有其他方法可以增加这个空间?
而且,最好是有一个更可持续的解决方案,允许我构建多个图像而不必搜索可以清理系统的地方?
因此,我在 Docker 容器中有一个使用 Qt 的项目(用于 C++ 服务器应用程序)。
当我尝试在另一台计算机上运行该映像时,收到错误消息
error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我确保库文件确实存在于容器中,它确实存在
find . -name *Qt5Core*
...
./usr/lib/x86_64-linux-gnu/libQt5Core.so.5
...
Run Code Online (Sandbox Code Playgroud)
所以我认为LD_LIBRARY_PATH可能没有正确设置,因此我添加了
ENV LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}"
Run Code Online (Sandbox Code Playgroud)
到我的 Dockerfile。
但错误仍然存在。
请注意,另一台机器使用 Podman 而不是 Docker(它没有安装实际的 Docker,我不是管理员,因此我无法测试它是否可以使用 Docker 工作)。
我创建图像的计算机安装了 Qt,因此问题可能不会出现在那里,因为它可以从容器外部使用该库。
有什么是我忽略的吗?
(我可以尝试将库文件复制到容器内可执行文件所在的同一文件夹中,但如果可能的话,我更喜欢更干净的解决方案。)
(有一个问题:Linux: Can't find Existing Shared Library in dockerContainer,这听起来有点相似,但是,那里的解决方案围绕着cmake,我不使用它。)
编辑:如果相关,当我使用ldd构建CMD它的计算机上的 Dockerfile 的指令检查容器内可执行文件的依赖关系时,我得到
podman run --pod my_pod -it test_server
linux-vdso.so.1 (0x00007ffdb45a4000)
libQt5Network.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Network.so.5 (0x00007efcdf0ee000) …Run Code Online (Sandbox Code Playgroud) 在一个项目中,我使用(有点旧的版本)VTK,它会在 GCC 上产生一个已弃用的警告:
In file included from <path STL>/backward/strstream:51:0,
from <path VTK>/vtkIOStream.h:112,
from <path VTK>/vtkSystemIncludes.h:40,
from <path VTK>/vtkIndent.h:24,
from <path VTK>/vtkObjectBase.h:43,
from <path VTK>/vtkSmartPointerBase.h:26,
from <path VTK>/vtkSmartPointer.h:23,
from <some file in my project>
<path STL>/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To …Run Code Online (Sandbox Code Playgroud)