Docker中如何使用已有镜像内的预装软件包构建新镜像
Docker多阶段复用基础镜像mvn命令不存在解决方案
问题根因定位
核心问题基本出在第一个基础镜像的构建环节本身就没有成功安装maven,常见触发原因如下:
- Dockerfile 1中使用分号
;分隔命令,即使apt update执行失败(Ubuntu 18.04官方源已下线,默认执行apt update会报错),后续apt install仍会继续执行,最终maven实际未安装,你误以为镜像构建成功。 - 打标签时源镜像名称/版本写错:你构建Dockerfile 1时如果没有指定标签为
my_custom_image:1-0,执行docker tag时会自动创建一个空镜像,后续推送的就是没有maven的空镜像。 - 构建第二个镜像时拉取了本地缓存的旧版本坏镜像,没有拉取远端最新的正确镜像。
完整修复步骤
1. 修正Dockerfile 1写法
替换为支持Ubuntu 18.04的源,使用&&分隔命令保证链路执行失败时直接中断构建,避免静默失败:
FROM ubuntu:18.04 # 替换Ubuntu 18.04可用的归档源 RUN sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list && \ sed -i 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list && \ apt update -y && \ apt upgrade -y && \ apt install maven -y && \ # 构建阶段直接验证maven安装,提前暴露问题 mvn --version
2. 简化构建打标签流程,避免写错版本
直接在构建时指定最终推送的标签,省略二次tag步骤,减少出错概率:
# 注意末尾的.是Dockerfile所在目录,不要漏 docker build -t external/my_custom_image:1.0 .
3. 本地验证基础镜像有效性
推送前先本地启动镜像验证maven是否正常:
docker run --rm external/my_custom_image:1.0 mvn --version
如果命令能正常输出版本号,再执行推送:
docker push external/my_custom_image:1.0
4. 构建第二个镜像时禁用缓存
避免拉取本地旧的坏缓存镜像:
docker build --no-cache -t your-second-image .
内容的提问来源于stack exchange,提问作者newUser
相关产品推荐
相关产品推荐

