【Docker】解决:构建(docker build)或重新运行容器时,丢失apt-get update问题

一、解决:构建(docker build)或重新运行容器时,丢失apt-get update问题

在 Docker 容器中,每次构建(docker build)或重新运行容器时,默认情况下所有更改都会丢失,因为容器是基于镜像的临时实例。要保留 apt-get update 和安装的工具,你需要将这些操作固化到 Docker 镜像中,而不是在容器运行时执行。以下是几种方法:


方法 1:在 Dockerfile 中固化更新和安装

apt-get update 和安装命令写入 Dockerfile,这样每次构建镜像时都会自动执行这些操作,并保留在镜像中。

示例 Dockerfile
FROM ubuntu:22.04  # 替换成你的基础镜像# 更新 apt 缓存并安装工具(推荐合并 RUN 以减少层数)
RUN apt-get update && \apt-get install -y \curl \wget \vim \git \&& \rm -rf /var/lib/apt/lists/*  # 清理缓存减小镜像体积# 其他操作...
CMD ["bash"]
构建镜像
docker build -t my-custom-image .
运行容器
docker run -it my-custom-image

优点

  • 所有更改都会固化到镜像中,后续运行容器时无需重新安装。
  • 适合长期使用的环境。

方法 2:使用 docker commit 保存临时更改

如果你已经在运行的容器中执行了 apt-get update 和安装工具,可以通过 docker commit 将当前容器状态保存为新镜像:

# 1. 启动一个临时容器
docker run -it ubuntu:22.04 bash# 2. 在容器内执行更新和安装
apt-get update && apt-get install -y curl wget# 3. 在另一个终端中提交容器为新镜像
docker ps  # 查看容器ID
docker commit <CONTAINER_ID> my-updated-image# 4. 之后可以用新镜像运行
docker run -it my-updated-image

适用场景

  • 临时调试后需要保存状态。
  • 不适合生产环境(推荐用 Dockerfile)。

方法 3:挂载卷(Volume)持久化数据

如果某些工具或配置文件需要持久化(如 /var/cache/apt),可以使用 Docker 卷(Volume):

# 创建卷
docker volume create apt-cache# 运行容器并挂载卷
docker run -it -v apt-cache:/var/cache/apt ubuntu:22.04 bash

适用场景

  • 缓存 apt 数据加速后续安装(但工具仍需重新安装)。
  • 不适合固化已安装的工具。

方法 4:使用 docker build --cache-from 重用缓存

如果频繁构建镜像,可以利用 Docker 缓存避免重复下载:

# 首次构建(缓存会存储)
docker build -t my-image .# 后续构建时重用缓存
docker build --cache-from my-image -t my-image .

适用场景

  • 加速构建过程,但不会改变镜像内容。

最佳实践总结

场景推荐方法
固化工具到镜像Dockerfile 中写 RUN apt-get update && apt-get install
临时修改后保存docker commit(仅调试用)
持久化缓存挂载 Volume(如 /var/cache/apt
加速构建docker build --cache-from

关键点

  • Docker 容器是无状态的:所有运行时修改都会在容器停止后丢失。
  • 镜像才是持久化的载体:通过 Dockerfiledocker commit 将更改保存到镜像。

如果你的目标是让容器每次启动时都自动安装工具(不推荐),可以在启动脚本中写入安装命令(如 ENTRYPOINT),但这会显著增加启动时间。

二、实战

要在 Dockerfile 中固化 apt-get update 和安装工具,同时保持与你的 docker-compose.yaml 兼容,你可以按照以下步骤操作:


1. 创建自定义 Nginx 镜像的 Dockerfile

在你的项目目录中创建一个 Dockerfile,基于 nginx:1.17.6 并添加所需的工具(如 vimcurl 等):

# 使用你的 Nginx 基础镜像
FROM nginx:1.17.6# 更新 apt 缓存并安装工具(合并 RUN 以减少镜像层数)
RUN apt-get update && \apt-get install -y \vim \curl \wget \net-tools \  # 包含 ifconfig 等网络工具&& \rm -rf /var/lib/apt/lists/*  # 清理缓存减小镜像体积# 复制你的 Nginx 配置文件(如果和 docker-compose.yaml 的 volumes 冲突,可注释掉)
# COPY nginx.conf /etc/nginx/nginx.conf# 声明容器启动时执行的命令(可省略,因为基础镜像已有 CMD)
# CMD ["nginx", "-g", "daemon off;"]

2. 修改 docker-compose.yaml 使用自定义镜像

更新 docker-compose.yaml,将 image: nginx:1.17.6 替换为你构建的自定义镜像:

version: '3.1'services:nginx:restart: alwayscontainer_name: nginx-basebuild: .  # 使用当前目录的 Dockerfile 构建镜像# image: nginx:1.17.6  # 注释掉,改用 buildtty: trueports:- 2500:2500- 3001:3001# ...(其他端口映射保持不变)volumes:- ./nginx.conf:/etc/nginx/nginx.conf- ./log:/var/log/nginx- ./html:/etc/nginx/html- ./cert:/etc/nginx/certnetworks:default:external:name: xph_network

3. 构建并启动容器

运行以下命令构建自定义镜像并启动服务:

docker-compose build  # 构建镜像(仅第一次或 Dockerfile 变更时需要)
docker-compose up -d  # 启动容器

4. 验证工具是否已安装

进入容器检查工具是否生效:

docker exec -it nginx-base bash
# 在容器内测试工具
vim --version
curl --version

关键注意事项

  1. volumes 会覆盖镜像中的文件

    • 如果你的 Dockerfile 中有 COPY nginx.conf /etc/nginx/nginx.conf,但 docker-compose.yaml 又挂载了 ./nginx.conf:/etc/nginx/nginx.conf,则挂载的配置文件会覆盖镜像中的文件。
    • 如果不需要动态修改配置文件,建议直接在 Dockerfile 中固化配置。
  2. 减少镜像层数

    • 将多个 RUN 命令合并为一个(如示例中用 && 连接),避免生成过多镜像层。
  3. 清理缓存

    • rm -rf /var/lib/apt/lists/* 可以显著减小镜像体积。
  4. 生产环境建议

    • 如果工具只是调试用,建议通过 docker exec 手动安装,而不是固化到镜像中。

扩展:多阶段构建(如需复杂工具)

如果安装过程较复杂(如需要编译),可以使用多阶段构建优化镜像大小:

FROM nginx:1.17.6 as builderRUN apt-get update && \apt-get install -y build-essential && \# 编译某些工具...rm -rf /var/lib/apt/lists/*FROM nginx:1.17.6COPY --from=builder /usr/local/bin/some-tool /usr/local/bin/

这样最终镜像只包含必要的工具,不保留编译环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/pingmian/86514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流程管理系统方案成本评估报告(第一稿,复盘明确数据不准确,仅供参考哦)

​​一、成本评估框架​​ 所在制造业流程数字化转型的成本需从​​一次性投入​​与​​持续运营成本​​两个维度分析,并量化​​直接收益​​与​​间接收益​​。详细评估模型初稿: ​​二、成本构成与数据支撑​​ ​​1. 一次性投入成本​​ ​​项目​​​​费用范围…

高并发分布式锁解决方案对比与选型指南

高并发分布式锁解决方案对比与选型指南 在大规模分布式系统中&#xff0c;分布式锁是确保资源互斥访问、保证数据一致性的关键组件。针对不同业务场景&#xff0c;分布式锁的实现方案多种多样&#xff0c;各有优缺点。本文将从问题背景出发&#xff0c;对Redis原生锁/RedLock、…

全面掌握Vue 3响应式:ref自动解包、reactive对象替换及响应式丢失问题

Vue 3的响应式系统是其最核心的特性之一&#xff0c;主要通过ref和reactive这两个API来实现。本文将详细介绍这两个API的使用方法、区别以及最佳实践。 1. ref()的基本使用 ref()用于创建一个响应式的数据引用。它可以包装任何类型的值&#xff0c;包括基本类型和对象类型。 …

【科普】 AI大模型应用架构图大全

AI大模型应用架构图大全 AI大模型技术全景视图&#xff1a; AI大模型通用技术架构图 AI大模型通用技术架构图 AI大模型通用技术架构图 RAG知识库业务架构图 AI农业大模型技术架构图 AI导购大模型技术架构图 AI导购大模型技术架构图 AI大模型合规风控管理架构图 AI大模型合规管…

Educational Codeforces Round 180 (Rated for Div. 2) A-D题解

A. Race 题意 在一个数轴上&#xff0c;奖品可能出现在 x x x 点或 y y y 点&#xff0c;Alice 现在在 a a a 点&#xff0c;请问Bob是否存在一个点 b b b&#xff0c;使得无论奖品出现在 x x x 点还是 y y y 点&#xff0c;Bob都能比Alice先拿到&#xff08; ∣ b −…

IPv6配置

IPv6的基本配置 构建如下图所示的实训拓扑&#xff0c;按如下要求完成实训内容&#xff1a; &#xff08;1&#xff09;启用路由器的IPv6功能&#xff1b; &#xff08;2&#xff09;配置路由器接口的IPv6地址&#xff1b; &#xff08;3&#xff09;测试两台路由器的连通性…

flutter项目环境升级二:从Flutter2.10.5升级到3.29.3

系统:windows Android Studio:Android Studio Meerkat Feature Drop | 2024.3.2 Patch 1 Flutter SDK: Flutter3.29.3 JDK: java 17 详细的AGP / Gradle / Kotlin / JDK版本兼容关系可以百度或者到官方文档查询,其他博主给的很详细。确认好想要的版本兼容 这位大哥有对照表…

【网站内容安全检测】之1:获取网站所有链接sitemap数据

不多BB&#xff0c;直接上代码&#xff1a; main.go package mainimport ("bufio""crypto/tls""fmt""io""net/http""net/url""os""strings""sync""time"_ "net/ht…

从零构建vue3项目(二)

Vue3项目增强配置&#xff1a;Axios封装、鉴权与代码扫描 1. Axios二次封装与拦截器配置 安装Axios npm install axios创建Axios实例 src/utils/request.js import axios from axios import { useUserStore } from /stores/user import router from /router// 创建axios实例…

哪家香港站群服务器比较好用?

面对鱼龙混杂的服务商市场&#xff0c;哪家的香港站群服务器真正稳定&#xff1f;毕竟搞站群最怕的就是服务器抽风&#xff0c;轻则掉排名&#xff0c;重则客户跑光光。今天咱就重点聊聊哪家香港站群服务器比较好用&#xff1f; 一般来说&#xff0c;在选择香港站群服务器提供…

Python的科学计算库NumPy(二)

5. 索引和切片 5.1 一维数组的索引和切片 import numpy as np# 一维数组索引和切片&#xff0c;跟python中的集合同样使用 bin_list[1,2,3,4,5,6] bin_arraynp.array(bin_list) print(bin_array[3]) print(bin_array[1:4]) print(bin_array[-2:-1])5.2 多维数组的索引 # 多维…

STM32和C++ 实现配置文件导入、导出功能

一.配置文件导出功能 // 导出流程 // 1. 客户端 → 设备:导出配置请求,例如:GetFlashData[d6fe30323454]:{ini} ,其中[]里面是设备序列号 // 2. 设备 → 客户端:配置文件元数据(总大小、块数量) // 3. 设备 → 客户端:发送块1(包含块序号和大小) // 4. 设备 → 客户端:…

HTTP 请求基础知识

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言HTTP 请求方法GETPOSTPUTDELETE其他方法 HTTP 请求结构常用请求头实际应用示例响应状态码 前言 HTTP (Hypertext Transfer Protocol) 是互联网上应用最广泛的协…

Django ORM 1. 创建模型(Model)

1. ORM介绍 什么是ORM&#xff1f; ORM&#xff0c;全称 Object-Relational Mapping&#xff08;对象关系映射&#xff09;&#xff0c;一种通过对象操作数据库的技术。 它的核心思想是&#xff1a;我们不直接写 SQL&#xff0c;而是用 Python 对象&#xff08;类/实例&…

【C/C++】C++ 编程规范:101条规则准则与最佳实践

C 编程规范&#xff1a;101条规则准则与最佳实践 引言 C 是一门强大而复杂的语言&#xff0c;能高效控制硬件&#xff0c;也能写出优雅抽象。然而&#xff0c;正因其复杂性&#xff0c;项目中若缺乏统一规范&#xff0c;极易陷入混乱、难维护、易出错的泥潭。 本文总结了 10…

柔性屏激光修屏禁区突破:新启航如何实现曲面 OLED 面板的无损修复?

一、引言 柔性 OLED 面板凭借其轻薄、可弯曲等特性&#xff0c;在智能终端、可穿戴设备等领域广泛应用。然而&#xff0c;生产过程中面板易出现缺陷&#xff0c;传统修复方法难以满足曲面 OLED 面板的无损修复需求。新启航半导体有限公司在激光修屏技术上取得突破&#xff0c;…

UI前端与数字孪生结合案例分享:智慧零售的可视化解决方案

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;智慧零售的可视化变革 在数字化浪潮下&#xff0c;零售行业正从 “人货场…

Docker 入门教程(四):容器命令

文章目录 &#x1f433; Docker 入门教程&#xff08;四&#xff09;&#xff1a;容器命令创建并运行容器&#xff1a;docker run查看容器列表&#xff1a;docker ps停止、启动、重启容器删除容器&#xff1a;docker rm进入容器&#xff1a;exec 和 attach查看容器日志&#xf…

2025.06.27【技术观察L0】AlphaGenome:DeepMind推出的全新AI基因组解读平台

AlphaGenome&#xff1a;DeepMind推出的全新AI基因组解读平台详解 2025年6月&#xff0c;Google DeepMind团队正式发布了AlphaGenome——一款面向基因组功能解读和变异效应预测的全新人工智能模型。AlphaGenome的出现&#xff0c;标志着AI在基因组学领域迈出了重要一步&#x…

[ARM-2D 专题]7. OOP实现之继承,宏implement_ex的实现和解析

implement_ex宏是 Arm-2D 库中用于面向对象编程&#xff08;OOP&#xff09;支持的核心宏定义。 implement_ex 宏的定义和作用 implement_ex 宏在 Library/Include/arm_2d_utils.h 中定义&#xff0c;用于在 C 语言中实现类似继承的功能&#xff1a; /*!* \note do NOT use t…