如何创建保留Ubuntu基础层与自定义修改层的Docker镜像
实现两层Docker镜像的方案
核心思路
放弃将Ansible构建阶段与最终镜像合并为单层的做法,转而通过构建阶段生成配置完成的文件系统,再将其完整复制到干净的ubuntu:jammy镜像中,最终得到两层结构:底层为官方ubuntu:jammy基础层,上层为你的自定义修改层,同时完全剔除Ansible及构建残留文件。
具体实现步骤
1. 准备Ansible相关文件
确保你的playbook(比如命名为base-setup.yml)包含nginx-extras、nodejs及工具的安装逻辑,且在playbook末尾添加清理冗余文件的步骤,比如:
- name: Clean up apt cache apt: autoclean: yes autoremove: yes purge: yes - name: Remove apt lists file: path: /var/lib/apt/lists/* state: absent
2. 编写分层构建的Dockerfile
# 第一阶段:Ansible构建阶段,仅用于执行配置操作 FROM ubuntu:jammy as builder # 安装Ansible及依赖 RUN apt-get update && \ apt-get install -y --no-install-recommends ansible python3-pip && \ rm -rf /var/lib/apt/lists/* # 复制Ansible配置和playbook到镜像内 COPY ansible.cfg /etc/ansible/ansible.cfg COPY base-setup.yml /tmp/base-setup.yml # 执行playbook完成系统配置 RUN ansible-playbook /tmp/base-setup.yml -c local # 第二阶段:生成最终的两层镜像 FROM ubuntu:jammy # 从构建阶段复制所有配置后的文件到当前镜像 # Docker会自动对比基础镜像与构建镜像的文件差异,仅将变化部分作为新层 COPY --from=builder / / # 可选:设置默认启动命令 CMD ["nginx", "-g", "daemon off;"]
3. 关键细节说明
- 分层逻辑:最终镜像的底层是官方
ubuntu:jammy,上层仅包含构建阶段中对系统的修改内容,Docker会自动识别文件差异并生成独立层,既保留基础层的缓存优势,又明确镜像来源。 - 残留规避:Ansible仅存在于临时的
builder镜像中,最终镜像不会包含任何Ansible相关文件;playbook的清理步骤则确保apt缓存、临时文件等冗余内容被彻底移除。 - 缓存优化:若仅修改playbook配置,
builder阶段中安装Ansible的步骤会复用缓存;若ubuntu:jammy基础镜像更新,底层会自动拉取新的基础层,上层修改部分不受影响。
4. 构建与验证
执行构建命令:
docker build -t my-custom-base:jammy .
用以下命令查看镜像层结构,确认两层的存在:
docker history my-custom-base:jammy
内容的提问来源于stack exchange,提问作者galatians
相关产品推荐
相关产品推荐

