【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.pswp.cn/pingmian/86514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86514.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋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…