Docker构建镜像报错:无法定位软件包 命令返回非零代码100
Docker构建Ubuntu镜像报"Unable to locate package"错误排查
问题复现
执行如下命令构建自定义镜像时持续报错:
sudo docker build -t docker-custom-app .
初始使用的Dockerfile内容如下:
FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get upgrade -y &&\ apt-get install -y curl &&\ apt-get install -y python3 &&\ apt-get install -y python3-pip &&\ pip install flask &&\ pip install flask-mysql COPY . /opt/source-code ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
首次构建返回核心报错:
E: Unable to locate package curl The command '/bin/sh -c apt-get update && apt-get upgrade -y &&apt-get install -y curl &&apt-get install -y python3 &&apt-get install -y python3-pip &&pip install flask &&pip install flask-mysql' returned a non-zero code: 100
后续多次调整RUN指令的软件包安装顺序、安装列表,先后测试两类配置:
- 第一类调整后配置
构建报错:RUN apt-get update && apt-get upgrade -y &&\ apt-get install -y software-properties-common &&\ pip install flask &&\ pip install flask-mysqlE: Unable to locate package software-properties-common,RUN指令返回非零代码100。 - 第二类调整后配置
构建报错:RUN apt-get update && apt-get upgrade -y &&\ apt-get install -y python3 &&\ apt-get install -y software-properties-common &&\ pip install flask &&\ pip install flask-mysqlE: Unable to locate package python3,RUN指令同样返回非零代码100。
所有调整均触发「无法定位目标软件包、命令返回非零代码100」的同类错误。
根因与解决方案
该类报错的核心原因是 apt-get update步骤未成功拉取到Ubuntu软件源的包索引文件,导致后续执行apt install时系统无法匹配到对应安装包,和调整安装顺序、更换安装包的操作没有直接关系,按以下优先级排查即可:
- 优先排查构建网络问题
国内网络环境下默认Ubuntu官方源服务器在海外,大概率出现连接超时、索引下载失败的问题。构建时可以先加宿主机网络参数测试:
如果加了参数能正常构建,说明是默认桥接网络的连通性问题,可以直接修改Docker配置指定公共DNS:编辑sudo docker build --network=host -t docker-custom-app ./etc/docker/daemon.json写入如下配置,重启Docker服务后再构建:
重启命令:{ "dns": ["114.114.114.114", "8.8.8.8"] }sudo systemctl daemon-reload && sudo systemctl restart docker - 替换软件源为国内镜像(国内环境必做)
不要依赖默认的官方源,在apt操作前直接替换为国内高校、云厂商维护的镜像源,从根源避免网络问题。同时优化Dockerfile写法,合并安装命令、清理无用缓存减小镜像体积,修正后可直接使用的Dockerfile参考:FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive # 替换Ubuntu软件源为国内镜像 RUN sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list &&\ sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list &&\ apt-get update && apt-get upgrade -y &&\ # 合并所有apt包安装命令,加--no-install-recommends减少无关依赖 apt-get install -y --no-install-recommends curl python3 python3-pip &&\ # pip换国内源安装Python依赖 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple flask flask-mysql &&\ # 清理apt缓存,减小镜像体积 apt-get clean && rm -rf /var/lib/apt/lists/* COPY . /opt/source-code # flask默认监听127.0.0.1,加--host=0.0.0.0允许容器外部访问 ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run --host=0.0.0.0 - 注意不要把
apt-get update和后续的apt install拆成多个独立RUN指令,否则会因为Docker的镜像层缓存机制,导致后续构建时复用旧的、失效的源索引缓存,同样会触发找不到包的错误。
内容的提问来源于stack exchange,提问作者Thomas B
相关产品推荐
相关产品推荐

