Docker中Ubuntu14.04执行安装脚本触发preinst与dpkg报错求助
解决Docker Ubuntu14.04容器中安装deb包的集群检查报错问题
这个报错的核心原因是你要安装的deb包的preinst预安装脚本,在执行时会检查某个集群是否存在,但Docker容器的极简环境里既没有这个集群,脚本又不允许创建新集群,所以触发了安装失败。而原生Ubuntu14.04系统里可能默认带有该集群的基础配置或运行着相关服务,因此能正常安装。下面是具体的排查和解决步骤:
1. 先明确preinst脚本的检查逻辑
首先得搞清楚这个预安装脚本到底在找什么集群,运行以下命令查看脚本内容:
cat /var/lib/dpkg/tmp.ci/preinst
重点看包含The requested cluster does not exist相关的代码块,判断它是在检查某个系统服务(比如corosync、pacemaker这类集群工具)、配置文件,还是环境变量、socket标识?明确检查目标才能精准解决问题。
2. 分场景解决问题
场景A:程序依赖的集群服务未安装
如果脚本检查的是某个集群相关的系统服务,你需要在Dockerfile里先安装对应的依赖包。比如依赖corosync集群的话,就添加:
RUN apt-get update && apt-get install -y corosync pacemaker
执行完依赖安装后,再运行你的install.sh。注意Ubuntu14.04的软件源需要先更新,避免找不到包。
场景B:无需集群功能,跳过检查
如果你的使用场景不需要这个程序的集群功能,可以修改preinst脚本跳过检查:
- 解压deb包并提取脚本:
mkdir deb_temp dpkg-deb -x arch.deb deb_temp/ dpkg-deb -e arch.deb deb_temp/DEBIAN/ - 编辑
deb_temp/DEBIAN/preinst,找到集群检查的代码段,将其注释或删除。 - 重新打包deb包:
dpkg-deb -b deb_temp/ modified_arch.deb - 用修改后的包替换原包,再执行安装脚本即可。
场景C:创建假配置骗过检查
如果脚本只是检查某个配置文件或标识是否存在,你可以手动创建对应的内容。比如脚本检查/etc/cluster.conf,就在Dockerfile里添加:
RUN touch /etc/cluster.conf && echo "fake cluster config" > /etc/cluster.conf
完成后再运行安装脚本即可。
3. Docker容器额外注意事项
- Docker容器默认以root用户运行,你的Dockerfile里
RUN sudo ./dir/install.sh完全没必要,直接写成RUN ./dir/install.sh即可,避免sudo带来的不必要权限问题。 - Ubuntu14.04的Docker镜像极其精简,很多原生系统默认自带的工具都缺失,安装前建议先装上基础工具:
RUN apt-get update && apt-get install -y --no-install-recommends curl wget ca-certificates,减少后续安装的依赖问题。
内容的提问来源于stack exchange,提问作者Monday to Friday
相关产品推荐
相关产品推荐

