AWS Linux 2上两阶段构建带curl的Keycloak镜像时dnf挂起
问题:Keycloak两阶段镜像构建时dnf挂起在glibc脚本执行环节
执行包含curl的Keycloak两阶段镜像构建时,dnf在运行running scriplet glibc-2.34-125.el9_5.3.x86_64环节挂起。该构建在Windows机器上可正常运行,但在AWS Linux 2服务器上失败,更换多台AWS服务器均出现此问题,寻求排查建议。
背景说明
Keycloak官方镜像极度精简,移除了yum、microdnf、dnf、rpm等包管理器以缩小攻击面。官方推荐采用两阶段构建,在干净rootfs中安装所需工具后复制到最终镜像,本次构建的上半部分直接沿用官方推荐配置,Dockerfile如下:
# create builder image with curl properly installed FROM registry.access.redhat.com/ubi9 AS ubi-micro-build RUN mkdir -p /mnt/rootfs RUN dnf clean all # troubleshooting step RUN dnf upgrade # troubleshooting step RUN dnf install --installroot /mnt/rootfs curl --releasever 9 --setopt install_weak_deps=false --nodocs -y && \ dnf --installroot /mnt/rootfs clean all && \ rpm --root /mnt/rootfs -e --nodeps setup # starting with base keycloak image FROM quay.io/keycloak/keycloak:26.1 # copy from build image to custom image USER root COPY --from=ubi-micro-build /mnt/rootfs / # continue with snc specific files USER 1000 RUN mkdir /opt/keycloak/data/import COPY snc-export.json /opt/keycloak/data/import
排查建议
- 检查AWS Linux 2服务器的Docker版本:Windows和AWS上的Docker版本差异可能导致构建行为不同,尝试升级AWS服务器上的Docker到最新稳定版。
- 禁用glibc脚本执行:在
dnf install命令中添加--setopt=tsflags=noscripts参数,跳过rpm脚本执行,避免脚本挂起(适用于不需要glibc初始化脚本的场景)。 - 更换构建基础镜像:尝试使用
ubi9-minimal替代ubi9作为构建阶段的基础镜像,精简镜像可能减少脚本执行环节的冲突。 - 增加构建日志详细度:修改dnf命令添加
-v参数,获取更详细的日志输出,定位挂起的具体原因。 - 检查AWS服务器资源:确认服务器的CPU、内存是否足够,dnf安装glibc时可能需要一定资源,资源不足会导致挂起。
- 手动执行脚本排查:进入ubi9镜像,手动挂载/mnt/rootfs并执行glibc的rpm脚本,复现挂起场景以定位问题。
内容的提问来源于stack exchange,提问作者Timothy Vogel
相关产品推荐
相关产品推荐

