You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:22:16