GitLab CI/CD中无法安装和更新软件包问题求助
看起来你遇到的是Docker容器内DNS解析失效,导致apt无法访问Ubuntu软件源的问题,我帮你梳理几个可能的原因和对应的解决办法:
1. 先修复Runner配置里的明显错误
你在GitLab Runner的Docker配置里写了extra_hosts = ["host"],这个格式完全不对!extra_hosts的正确格式应该是"hostname:ip_address",比如"my-server:192.168.1.100"。你只写了"host",Docker无法识别这个无效映射,甚至会干扰整个容器的DNS解析逻辑。
解决步骤:
- 打开Runner的配置文件(通常路径是
/etc/gitlab-runner/config.toml) - 删除
extra_hosts = ["host"]这一行 - 重启GitLab Runner:
sudo gitlab-runner restart
2. 别再手动修改/etc/resolv.conf(Ubuntu 20.04容器的坑)
在Ubuntu 20.04的Docker镜像里,/etc/resolv.conf默认是软链接到systemd-resolved维护的文件,你直接覆盖它其实不会生效——systemd-resolved会自动还原你的修改。
解决办法:
要么在修改前先删除软链接:
- rm -f /etc/resolv.conf - echo "nameserver 8.8.8.8" > /etc/resolv.conf - echo "nameserver 8.8.4.4" >> /etc/resolv.conf
要么干脆删掉CI脚本里修改resolv.conf的步骤——你已经在Runner配置里指定了DNS,Docker会自动把这个配置传递给构建容器,手动修改反而会引发冲突。
3. 检查Docker守护进程的全局DNS配置
如果Runner所在主机的Docker daemon本身DNS配置有问题,即使你在Runner里指定了DNS也没用。
解决步骤:
- 登录到GitLab Runner所在的主机
- 创建或编辑
/etc/docker/daemon.json文件,添加:
{ "dns": ["8.8.8.8", "8.8.4.4"] }
- 重启Docker和Runner:
sudo systemctl restart docker sudo gitlab-runner restart
4. 先确认容器的网络连通性
你可以在CI的before_script最前面加几个测试命令,定位到底是DNS的问题还是网络不通:
- # 先测试能不能ping通DNS服务器 - ping -c 3 8.8.8.8 - # 再测试能不能解析软件源域名 - nslookup archive.ubuntu.com
如果连ping 8.8.8.8都失败,那说明容器根本连不上外部网络,大概率是主机的防火墙/安全组限制了容器的出站流量,需要检查主机的iptables规则,或者云服务商的安全组是否允许容器访问53(DNS)、80/443(软件源)端口。
5. 换个更省心的镜像试试
Ubuntu 20.04的镜像有时候会因为源的问题导致解析失败,你可以试试用Alpine或者Debian的镜像,这些镜像体积小,预装了基础工具,源也更稳定:
比如换成Alpine镜像,CI脚本可以简化成:
deploy: image: alpine:latest stage: deploy tags: - deployment_runner only: - development before_script: - # Alpine用apk安装工具,比apt快很多 - apk add --no-cache openssh-client git - # 后续的SSH配置和原来一致 - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo "$SSH_PRIVATE_KEY" | base64 -d > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan -H $SSH_HOST > ~/.ssh/known_hosts
按照上面的步骤一步步排查,应该能解决你的问题!
备注:内容来源于stack exchange,提问作者Adbul

