Docker镜像构建网络访问异常问题求助
问题描述
宿主机为Pop_OS,Docker已更新至最新版本,/etc/docker/daemon.json配置如下:
{ "dns": ["8.8.8.8", "8.8.4.4"]}
Ubuntu镜像构建失败场景
Dockerfile内容:
FROM ubuntu:latest RUN apt-get install build-essential
执行docker build .时出现错误:
0.210 E: Unable to locate package build-essential ------ Dockerfile:2 -------------------- 1 | FROM ubuntu:20.04 2 | >>> RUN apt-get install build-essential 3 | -------------------- ERROR: failed to solve: process "/bin/sh -c apt-get install build-essential" did not complete successfully
移除apt安装命令后,容器内/etc/resolv.conf内容:
root@0a3c00aaaae0:/# cat /etc/resolv.conf nameserver 127.0.0.11 options ndots:0
Alpine镜像构建成功场景
修改Dockerfile为:
FROM alpine:latest RUN apk add curl
执行docker build .构建成功,容器内/etc/resolv.conf内容:
$ docker exec -it <container> /bin/sh / # cat /etc/resolv.conf nameserver 127.0.0.11 options ndots:0
该Alpine容器可正常ping通谷歌并进行网络交互。
请问导致Ubuntu镜像构建失败的原因是什么?
问题原因及解决办法
核心原因
Ubuntu镜像自带的软件源索引是旧的,直接执行apt-get install时,本地索引里找不到build-essential的最新包信息——这和DNS配置无关,你看到的127.0.0.11是Docker内置的DNS解析器,它会转发请求到你配置的8.8.8.8/8.8.4.4,Alpine能正常联网就说明DNS是正常的。而Alpine的apk工具默认在安装时会自动同步最新索引,或者镜像自带的索引足够新,所以没出现这个问题。
解决办法
修改Ubuntu的Dockerfile,先更新软件源索引再安装包:
FROM ubuntu:latest RUN apt-get update && apt-get install -y build-essential
加-y是为了自动确认安装选项,避免构建过程中卡住。
如果想减少镜像体积,还可以清理安装缓存:
FROM ubuntu:latest RUN apt-get update && \ apt-get install -y build-essential && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*
内容的提问来源于stack exchange,提问作者pri0ritize
相关产品推荐
相关产品推荐

