AWS EC2构建Golang Docker镜像卡在apk安装步骤问题排查
Docker构建Alpine阶段apk安装卡顿解决方案
卡顿出现在apk update执行完成、开始安装依赖包的阶段,本地构建正常、EC2实例突发故障且未修改Dockerfile/项目文件时,按以下优先级排查修复:
1. 优先排查Docker网桥MTU不匹配问题(最高发)
AWS EC2 VPC默认弹性网卡开启巨型帧,MTU值为9001,但Docker默认网桥MTU为1500,apk拉取软件包时出现数据包分片丢失,会直接卡住无任何报错输出。
- 验证方式:在EC2实例直接执行测试命令,如果同样卡住即可确认问题:
docker run --rm alpine apk add --no-cache git - 修复步骤:
- 编辑Docker daemon配置文件:
vi /etc/docker/daemon.json - 写入配置将Docker网桥MTU设置为1450(避开VPC分片阈值):
{ "mtu": 1450 } - 重启Docker服务生效:
systemctl restart docker - 重新执行
docker build .即可正常构建。
- 编辑Docker daemon配置文件:
2. 排查apk包下载链路异常
apk update能成功拉取索引文件,不代表后续包下载链路正常:
- 先修改Dockerfile中的apk执行命令,开启verbose日志定位具体卡住的环节:
RUN apk update -v && apk add -v --no-cache git make gcc libc-dev - 如果日志显示固定包下载超时,直接在apk命令前替换为EC2实例所在区域的内部软件源,走内网拉取包即可避免公网链路波动问题。
3. 排查基础资源问题
- 执行
df -h检查EC2实例磁盘剩余空间,Docker构建目录所在分区剩余空间不足3G时,会出现写入假死无报错的情况,清理冗余镜像/文件释放空间即可。 - 执行
docker info | grep "Storage Driver"检查存储驱动,如果为devicemapper且是loop模式,属于老版本Docker的默认配置,存在IO卡顿bug,升级Docker到20.10以上版本、使用默认的overlay2存储驱动即可修复。
临时规避方案
如果需要紧急发布,可先在本地PC完成镜像构建,推送到镜像仓库后在EC2实例直接拉取镜像部署,无需在EC2侧执行构建流程,待网络问题排查完成后再恢复EC2构建能力。
内容的提问来源于stack exchange,提问作者Marcos Federico Mandrille
相关产品推荐
相关产品推荐

