构建一个运行于Docker中的图形界面软件
软件仓库的软件
通常情况下,我们如果要将一个软件直接安装进 Docker,直接 install 即可。因为依赖会自动安装好。
修改的软件
如果一个软件包是修改自软件仓库的软件,一般也可以通过 apt-cache depends packageName
查看到依赖的软件包。
依次安装这些包即可。
apt-cache depends firefox
依赖: lsb-release
依赖: libasound2
依赖: libatk1.0-0
依赖: libc6
依赖: libcairo-gobject2
依赖: libcairo2
依赖: libdbus-1-3
依赖: libdbus-glib-1-2
依赖: libfontconfig1
依赖: libfreetype6
依赖: libgcc-s1
依赖: libgdk-pixbuf2.0-0
依赖: libglib2.0-0
依赖: libgtk-3-0
依赖: libharfbuzz0b
依赖: libpango-1.0-0
依赖: libpangocairo-1.0-0
依赖: libstdc++6
依赖: libx11-6
依赖: libx11-xcb1
依赖: libxcb-shm0
依赖: libxcb1
依赖: libxcomposite1
依赖: libxcursor1
依赖: libxdamage1
依赖: libxext6
依赖: libxfixes3
依赖: libxi6
依赖: libxrandr2
依赖: libxrender1
依赖: libxtst6
推荐: xul-ext-ubufox
推荐: libcanberra0
推荐: libdbusmenu-glib4
推荐: libdbusmenu-gtk3-4
建议: fonts-lyx
修改较大的软件
如果一个软件包修改程度较大,添加了新的依赖。 则可以通过先上述方式,在容器环境中 安装好已经查明的依赖包。 然后就可以用类似完全未知来源的软件方法来查找所需的软件依赖包了。
未知依赖的软件
ldd找出缺失的依赖库
通过 ldd 查看没有链接到的库。通过这些没有链接到的库名即可找到所需的依赖包。
root@d444d316c665:/opt/lithium# ldd lithium
linux-vdso.so.1 (0x00007ffdb53c8000)
libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007ff8ce496000)
libcef.so => ./libcef.so (0x00007ff8c108a000)
libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007ff8c08d9000)
libgdk-3.so.0 => /lib/x86_64-linux-gnu/libgdk-3.so.0 (0x00007ff8c07d4000)
libgdk_pixbuf-2.0.so.0 => /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007ff8c07ac000)
libgobject-2.0.so.0 => /lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007ff8c074c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff8c00a9000)
libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007ff8c007f000)
libXtst.so.6 => not found
libgbm.so.1 => not found
libpango-1.0.so.0 => /lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007ff8bfb06000)
libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007ff8bf9e3000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff8ce5d9000)
libxshmfence.so.1 => not found
libepoxy.so.0 => /lib/x86_64-linux-gnu/libepoxy.so.0 (0x00007ff8bf6a9000)
# ldd -v lithium # 可以查看更多详细信息
此时可以通过 grep
筛选来快速查看缺少的库
ldd /package/path/bin | grep "not found"
root@d444d316c665:/opt/lithium# ldd lithium | grep "not found"
libXtst.so.6 => not found
libgbm.so.1 => not found
libxshmfence.so.1 => not found
使用apt-file
根据动态库找依赖包
有关 apt-file
的安装和使用,请参见我的 另一篇apt
笔记
# 以下两种方式都可以找到所需的依赖包
dpkg -S libX11.so.6 # 只能用来查找已经安装好的包所带的库,换言之只能用来查询已知库与软件包的关系,而不能查找未知的包
apt-file search /usr/lib32/libstdc++.so.6
工具脚本
理解了以上流程后,快速安装好一个软件的依赖库的步骤就可以比较方便的封装进一个个脚本来代替手动操作。
一次解决 apt-file
环境,在安装软件时,如果速度很慢,可以通过我的另一个脚本工具快速替换软件源为国内源
apt update; apt install apt-file; apt-file update
核心逻辑就是通过查找出来的动态库循环查找对应的软件包
ldd /bin/bash | awk '/=>/{print $(NF-1)}' |
while read n; do apt-file search $n; done |
awk '{print $1}' | sed 's/://' | sort | uniq
优化后,大概可以总结为如下脚本
pkgsLithium=$(ldd lithium | grep "not found" | awk '/=>/{print $(NF-3)}' | while read n; do apt-file search $n; done | awk '{print $1}' | sed 's/://' | sort | uniq)
pkgsGecko=$(ldd gecko/libxul.so | grep "not found" | awk '/=>/{print $(NF-3)}' | while read n; do apt-file search $n; done | awk '{print $1}' | sed 's/://' | sort | uniq)
pkgsChrome=$(ldd libcef.so | grep "not found" | awk '/=>/{print $(NF-3)}' | while read n; do apt-file search $n; done | awk '{print $1}' | sed 's/://' | sort | uniq)
[[ -n "$pkgsLithium" ]] && echo pkgsLithium
[[ -n "$pkgsGecko" ]] && echo pkgsLithium # 此处包含有仅火狐才具备的动态库,注意不要安装,可以运行
[[ -n "$pkgsChrome" ]] && echo pkgsLithium