學習 Dockerfile 常用指令

學習 Dockerfile 常用指令

在構建 Docker 鏡像時,Dockerfile 文件是一份至關重要的配置文件,它定義了構建鏡像的所有步驟。通過在 Dockerfile 中使用不同的指令(命令),我們可以控制鏡像的構建過程、設置環境、指定執行命令等。本文將為你詳細介紹 Dockerfile 中常用的指令及其用途,幫助你更好地理解和使用 Docker。

1. FROM

FROM 是 Dockerfile 中最基本的指令,它指定了基礎鏡像,所有的 Docker 鏡像都需要從某個基礎鏡像開始構建。

  • 作用:指定基礎鏡像。
  • 語法
    FROM <image-name>:<tag>
    
  • 示例
    FROM node:20-slim
    
    解釋:這個指令表示使用 node:20-slim 作為基礎鏡像。

2. RUN

RUN 指令用于在鏡像構建時執行命令。它可以用來安裝軟件包、運行腳本等,常用于配置和安裝依賴。

  • 作用:在鏡像構建時執行命令。
  • 語法
    RUN <command>
    
  • 示例
    RUN apt-get update && apt-get install -y curl
    
    解釋:該指令更新包管理器并安裝 curl

3. CMD

CMD 指令指定容器啟動時執行的默認命令。如果用戶沒有在運行容器時指定其他命令,Docker 將執行 CMD 中定義的命令。

  • 作用:指定容器啟動時的默認命令。
  • 語法
    CMD ["executable", "param1", "param2"]
    
    或者
    CMD command param1 param2
    
  • 示例
    CMD ["node", "server.js"]
    
    解釋:如果用戶未指定其他命令,容器啟動時將執行 node server.js

4. ENTRYPOINT

ENTRYPOINTCMD 類似,但具有更強的控制力。無論你傳遞什么命令給 docker runENTRYPOINT 定義的命令都會被執行。CMD 可以用來提供默認參數。

  • 作用:指定容器啟動時始終執行的命令。
  • 語法
    ENTRYPOINT ["executable", "param1", "param2"]
    
  • 示例
    ENTRYPOINT ["node", "server.js"]
    
    解釋:容器啟動時始終執行 node server.js,無論傳入什么命令行參數。

5. WORKDIR

WORKDIR 指令用于設置容器中的工作目錄,所有后續的命令(如 RUNCMD)都將在該目錄下執行。

  • 作用:設置工作目錄。
  • 語法
    WORKDIR <path>
    
  • 示例
    WORKDIR /app
    
    解釋:將工作目錄設置為 /app,后續的操作會在此目錄下進行。

6. COPY

COPY 指令用于將文件或目錄從主機復制到容器的指定位置。

  • 作用:復制本地文件或目錄到容器中。
  • 語法
    COPY <source> <destination>
    
  • 示例
    COPY . /app
    
    解釋:將當前目錄(主機中的 . )復制到容器中的 /app 目錄。

7. ADD

ADD 指令類似于 COPY,但功能更強大,支持從 URL 下載文件并自動解壓文件。

  • 作用:將本地文件或遠程文件復制到容器,并且支持解壓。
  • 語法
    ADD <source> <destination>
    
  • 示例
    ADD ./config.tar.gz /app/config/
    
    解釋:該指令將壓縮包 config.tar.gz 解壓到容器中的 /app/config/ 目錄。

8. ENV

ENV 指令用于設置環境變量,這些變量會在容器的整個生命周期中可用。

  • 作用:設置環境變量。
  • 語法
    ENV <key>=<value>
    
  • 示例
    ENV NODE_ENV production
    
    解釋:設置環境變量 NODE_ENVproduction,后續的命令或運行時都能訪問到這個環境變量。

9. EXPOSE

EXPOSE 指令用于聲明容器監聽的端口,通常用于文檔說明,告訴其他開發者容器會監聽哪些端口。它不會實際打開端口。

  • 作用:聲明容器暴露的端口。
  • 語法
    EXPOSE <port>
    
  • 示例
    EXPOSE 3000
    
    解釋:聲明容器會監聽端口 3000,容器在運行時,可以通過 docker run -p 映射到主機端口。

10. VOLUME

VOLUME 指令用于創建一個掛載點,可以將宿主機的目錄或 Docker 卷掛載到容器中,以便數據持久化。

  • 作用:定義容器掛載點,持久化數據。
  • 語法
    VOLUME ["/path"]
    
  • 示例
    VOLUME ["/data"]
    
    解釋:創建一個名為 /data 的掛載點,可以將容器中的數據持久化。

11. USER

USER 指令用于指定在容器中運行后續命令的用戶,通常為了安全考慮,避免以 root 用戶運行容器。

  • 作用:指定容器內運行命令的用戶。
  • 語法
    USER <username>
    
  • 示例
    USER node
    
    解釋:后續命令將以 node 用戶身份執行。

12. HEALTHCHECK

HEALTHCHECK 指令定義容器的健康檢查命令。Docker 會周期性地執行這個命令來檢查容器是否運行正常。

  • 作用:定義健康檢查命令。
  • 語法
    HEALTHCHECK CMD <command>
    
  • 示例
    HEALTHCHECK CMD curl --fail http://localhost:3000/health || exit 1
    
    解釋:容器會定期執行 curl 命令來檢查應用是否可用。

13. STOPSIGNAL

STOPSIGNAL 指令用于定義容器停止時發送的信號,默認情況下是 SIGTERM

  • 作用:定義停止容器時的信號。
  • 語法
    STOPSIGNAL <signal>
    
  • 示例
    STOPSIGNAL SIGKILL
    
    解釋:當容器停止時,Docker 將發送 SIGKILL 信號,而不是默認的 SIGTERM

14. ARG

ARG 指令用于定義構建時的變量,它的作用范圍僅限于構建階段。

  • 作用:定義構建時的變量。
  • 語法
    ARG <name>[=<default value>]
    
  • 示例
    ARG NODE_VERSION=20
    FROM node:${NODE_VERSION}-slim
    
    解釋:定義 NODE_VERSION 變量,并在 FROM 中使用該變量。

總結

指令作用執行時機
FROM指定鏡像基礎構建時
RUN執行命令,生成中間鏡像構建時
CMD容器啟動時的默認命令容器運行時
ENTRYPOINT容器啟動時強制執行的命令容器運行時
WORKDIR指定工作目錄構建+運行時
COPY復制本地文件構建時
ADD復制或解壓本地/URL 文件構建時
ENV設置環境變量構建+運行時
EXPOSE指定要暴露的端口僅用于文檔
VOLUME定義可掛載的存儲路徑容器運行時
USER指定運行命令的用戶構建+運行時
HEALTHCHECK健康檢查容器運行時

掌握這些常用指令,可以幫助你更加高效地編寫和管理 Dockerfile,構建出高質量的 Docker 鏡像。希望本文能對你有所幫助,歡迎留言交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63012.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63012.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63012.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

D95【python 接口自動化學習】- pytest進階之fixture用法

day95 pytest的fixture詳解&#xff08;二&#xff09; 學習日期&#xff1a;20241210 學習目標&#xff1a;pytest基礎用法 -- pytest的fixture詳解&#xff08;二&#xff09; 學習筆記&#xff1a; fixture(autouseTrue) func的autouse是TRUE時&#xff0c;所有函數方法…

C語言 字符串輸入輸出函數、scanf(“%[^\n]“,)可輸入空格 、fgets刪除換行符

字符串輸入函數&#xff1a; scanf&#xff08;"%s"&#xff0c;數組名&#xff09; gets&#xff08;數組名&#xff09; fgets&#xff08;&#xff09; --- 文件流輸入函數 函數原型&#xff1a; int scanf( const char *format, ...…

深度學習camp-第J4周:ResNet與DenseNet結合探索

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 本周任務&#xff1a; 探索ResNet和DenseNet的結合可能性本周任務較難&#xff0c;我們在chatGPT的幫助下完成 一、網絡的構建 設計一種結合 ResNet 和 Den…

「iOS」通過CoreLocation Framework深入了解MVC架構

「iOS」通過CoreLocation Framework重新了解多界面傳值以及MVC架構 文章目錄 「iOS」通過CoreLocation Framework重新了解多界面傳值以及MVC架構前言CoreLocation了解根據需求建模設計屬性方法設計協議傳值Block傳值KVONotification通知方式 總結參考文章 前言 在這個學期的前…

Debezium系列之:使用Debezium采集oceanbase數據庫

Debezium系列之:使用Debezium采集oceanbase數據庫 一、oceanbase數據庫二、安裝OceanBase三、安裝oblogproxy四、基于Docker的簡單采集案例五、生產實際應用案例Debezium 是一個開源的分布式平臺,用于監控數據庫變化和捕捉數據變動事件,并以事件流的形式導出到各種消費者。D…

線程sleep的時候會釋放鎖嗎

來看一段代碼&#xff1a; void task1(mutex &m) {cout << "thread 1 init..." << endl;{std::unique_lock<mutex> lock(m);cout << "thread 1 getLock" << endl;sleep(5);}cout << "thread 1 freeLock&quo…

wordpress建站--如何用Let‘s Encrypt給網站添加免費ssl證書,支持https訪問

本文首發網站&#xff1a;https://www.click234.com 默認情況下我們的網站是http訪問&#xff0c;為了增加訪問安全性&#xff0c;我們需要添加ssl證書&#xff0c;支持采用https方式訪問&#xff0c;今天我們來看下怎么創建免費的ssl證書--Lets Encrypt 使用 Certbot 自動化工…

青少年編程與數學 02-004 Go語言Web編程 02課題、依賴管理

青少年編程與數學 02-004 Go語言Web編程 02課題、依賴管理 課題摘要:一、項目結構各目錄說明&#xff1a; 二、依賴項三、依賴管理任務四、依賴管理步驟1. 初始化Go Modules項目2. 添加依賴3. 指定依賴版本4. 更新依賴5. 清理未使用的依賴6. 離線工作7. 模塊隔離8. 可重現構建 …

Debezium OracleConnection 分析

Debezium OracleConnection 分析 目錄 1. 概述2. 核心功能3. 實現分析4. 使用場景5. 示例分析6. 最佳實踐7. 總結1. 概述 OracleConnection 是 Debezium Oracle 連接器中的數據庫連接管理組件,主要負責: 數據庫連接的建立和管理事務控制查詢執行元數據操作LogMiner 會話管理…

【每日一練 基礎題】[藍橋杯 2022 省 A] 求和

[藍橋杯 2022 省 A] 求和 暴力破解會超時,用因式分解的平方差公式 a2 2abb2(a)2 a-2abb2(a-b)2 輸出整數((a1a2a3…an)-a1-a2-a3-…-an)/2 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);l…

ArrayList源碼分析、擴容機制面試題,數組和List的相互轉換,ArrayList與LinkedList的區別

目錄 1.java集合框架體系 2. 前置知識-數組 2.1 數組 2.1.1 定義&#xff1a; 2.1.2 數組如何獲取其他元素的地址值&#xff1f;&#xff08;尋址公式&#xff09; 2.1.3 為什么數組索引從0開始呢&#xff1f;從1開始不行嗎&#xff1f; 3. ArrayList 3.1 ArrayList和和…

【C++】- 掌握STL List類:帶你探索雙向鏈表的魅力

文章目錄 前言&#xff1a;一.list的介紹及使用1. list的介紹2. list的使用2.1 list的構造2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modi?ers2.6 list的迭代器失效 二.list的模擬實現1. list的節點2. list的成員變量3.list迭代器相關問題3.1…

Docker--Docker Container(容器) 之容器實戰

對docker容器的前兩篇文章 Docker–Docker Container(容器) 之 操作實例 Docker–Docker Container(容器&#xff09; Mysql容器化安裝 我們可以先在Docker Hub上查看對應的Mysql鏡像,拉取對應的鏡像&#xff1a; 拉取mysql5.7版本的鏡像&#xff1a; docker pull mysql:5.7…

ModuleNotFoundError: No module named ‘torchvision.transforms.functional_tensor‘

問題&#xff1a; 運行代碼時&#xff0c;報錯&#xff1a; … File “/home/xzy/anaconda3/envs/groundinggpt/lib/python3.10/site-packages/pytorchvideo/transforms/augmix.py”, line 6, in from pytorchvideo.transforms.augmentations import ( File “/home/xzy/anac…

【匯編語言】內中斷(二) —— 安裝自己的中斷處理程序:你也能控制0號中斷

文章目錄 前言1. 編程處理0號中斷1.1 效果演示1.2 分析所要編寫的中斷處理程序1.2.1 引發中斷1.2.2 中斷處理程序1.2.3 中斷處理程序do0應該存放的位置1.2.4 中斷向量表的修改1.2.5 總結 1.3 程序框架1.4 注意事項1.5 從CPU的角度看中斷處理程序1.6 一些問題的思考與解答 2. 安…

華為OD E卷(100分)23-連續字母長度

前言 工作了十幾年&#xff0c;從普通的研發工程師一路成長為研發經理、研發總監。臨近40歲&#xff0c;本想辭職后換一個相對穩定的工作環境一直干到老, 沒想到離職后三個多月了還沒找到工作&#xff0c;愁腸百結。為了讓自己有點事情做&#xff0c;也算提高一下自己的編程能力…

VS2019中無法跳轉定義_其中之一情況

我習慣了使用VS2019看stm的代碼&#xff1b; 遇到的問題&#xff0c;在導入代碼后&#xff0c;發現有些函數調用不能跳轉到定義&#xff1b; 問題描述步驟 1、導入代碼 2、跳轉&#xff0c;無法跳轉 1、中文路徑 2、刪除.vs文件 和網上查的都沒辦法解決 最后發現是VS不支持 …

讓 Win10 上網本 Debug 模式 QUDPSocket 信號槽 收發不丟包的方法總結

在前兩篇文章里&#xff0c;我們探討了不少UDP丟包的解決方案。經過幾年的摸索測試&#xff0c;其實方法非常簡單, 無需修改代碼。 1. Windows 下設置UDP緩存 這個方法可以一勞永逸解決UDP的收發丟包問題&#xff0c;只要添加注冊表項目并重啟即可。即使用Qt的信號與槽&#…

【設計模式】觀察者模式深度講解

文章目錄 概覽一、定義與特點二、角色與職責三、實現方式四、應用場景五、優缺點 Java實現Python實現 概覽 觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一種一對多的依賴關系&#xff0c;讓多個觀察者對象同時監聽某一個主題…

Elasticsearch:ES|QL 中的全文搜索 - 8.17

細心的開發者如果已經閱讀我前兩天發布的文章 “Elastic 8.17&#xff1a;Elasticsearch logsdb 索引模式、Elastic Rerank 等”&#xff0c;你就會發現在 8.17 的發布版中&#xff0c;有一個重要的功能發布。那就是 ES|QL 開始支持全文搜索了。在今天的文章中我們來嘗試一下。…