Docker镜像构建时bundling阶段卡住问题排查求助
Docker构建bundle阶段卡住调试建议
优先排查高概率问题
- 校验容器内bundler版本和宿主机是否一致:Gemfile.lock如果由高版本bundler生成,容器内低版本bundler解析依赖时极易出现死循环卡住的问题。可在bundle install执行前添加命令
RUN gem install bundler -v <你宿主机的bundler版本号>,指定版本安装后再执行安装操作。 - 排查依赖解析冲突:你已经开启了
DEBUG_RESOLVER=true和--verbose参数,仔细查看verbose输出最后停留的gem名称,该gem大概率存在版本冲突,可先在Gemfile中固定该gem的兼容版本再重试。另外你提前手动安装了sassc-rails和bulma-rails两个gem,建议先注释掉这两个单独安装的命令,交由bundle统一管理依赖版本,避免手动安装的版本和Gemfile声明的版本不匹配导致解析卡住。 - 检查构建网络连通性:宿主机能正常访问gem源不代表容器构建时可以访问,可在bundle install前临时添加测试命令
RUN curl -I <你使用的gem源地址,比如https://rubygems.org>,确认容器内可以正常访问gem源。如果是网络问题,可尝试在构建命令中指定公共DNS:docker build --dns 8.8.8.8 -t <tag> -f Dockerfile.production .,或者将gem源替换为国内镜像源。 - 补充编译依赖:很多原生gem安装时需要编译环境,你当前的Dockerfile中没有安装
build-essential基础编译套件,可在apt安装依赖的阶段添加build-essential包,避免编译过程卡住无输出。
通用调试手段
- 开启全量构建日志:执行构建时添加BUILDKIT参数输出完整实时日志,避免输出折叠遗漏关键信息:
BUILDKIT_PROGRESS=plain docker build -t <tag> -f Dockerfile.production . - 进入中间容器调试:如果构建卡在某一步,可找到该步之前的成功镜像id,启动容器手动执行bundle install命令排查:
docker run --rm -it <上一步成功的镜像id> /bin/bash,进入容器后手动执行bundle相关命令,观察具体卡住的原因。
其他已知问题修正
你当前Dockerfile中存在一个潜在的卡死点:切换到circleci普通用户后执行RUN apt-get purge cmdtest,普通用户没有apt操作权限,执行到该步骤时会卡在密码输入阶段,需要将该命令移动到USER circleci之前的root用户阶段执行。
内容的提问来源于stack exchange,提问作者Overload119
相关产品推荐
相关产品推荐

