學習Docker就應該掌握的dockerfile語法與指令

2021-12-22 霍格沃茲測試學院

收錄於話題 #測試開發實戰乾貨 | 原創合輯 113個內容



在日常的工作中,常常需要製作自己的項目的鏡像,一般通過以下兩種方式製作鏡像:Docker commit、Dockerfile。

Docker commit一般用做從一個運行狀態的容器來創建一個新的鏡像。定製鏡像應該使用Dockerfile來完成。

docker commit 容器名 新鏡像名:tag


使用這種方式的缺點是:1.對外不可解釋,不方便排查問題, 2.可維護性差、可閱讀性差。

Dockerfile 是由一系列指令和參數構成的腳本,一個 Dockerfile 裡面包含了構建整個鏡像的完整命令。Docker 通過docker build執行 Dockerfile 中的一系列指令自動構建鏡像。以下是 Dockerfile 中一些常用欄位的含義:

todo:下面命令太抽象,而且只是介紹,沒有demo,可以給每個命令引入demo,比如解釋 FROM ubuntu:16.04

FROM:基礎鏡像,FROM 命令必須是 Dockerfile 的首個命令。

LABEL:為鏡像生成元數據標籤信息。原有指令 MAINTAINER 已經放棄使用,用 LABEL maintainer="hogwarts@testing-studio.com" 替代。

USER:指定運行容器時的用戶名或 UID,後續 RUN 也會使用指定用戶。

RUN:RUN 命令是 Dockerfile 執行命令的核心部分。它接受命令作為參數並用於創建鏡像。每條 RUN 命令在當前基礎鏡像上執行,並且會提交一個新鏡像。

VOLUME:定義匿名卷,容器運行時應該儘量保持容器存儲層不發生寫操作,為了防止運行時用戶忘記將動態文件保存的目錄掛載為卷,可以事先指定某些目錄掛載為匿名卷。這樣就不會向容器存儲層寫入大量數據。

WORKDIR:WORKDIR 命令用於設置 CMD 指明的命令的運行目錄。為後續的 RUN、CMD、ENTRYPOINT、ADD 指令配置工作目錄。可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。使用 docker exec -it 進入容器後,默認也會進入到 WORKDIR 指定的目錄。

ENV:指定容器啟動時的環境變量(注意,只有在容器啟動時,啟動腳本能讀取到,如果希望其他用戶登錄到容器也生效的話,需要寫入 .bashrc)。

COPY:COPY 命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上複製文件到目標容器的文件系統。

EXPOSE:指定埠轉發

CMD:設置容器創建是執行的默認命令。支持三種格式,默認會被 docker run 指定的參數覆蓋。每個容器只能執行一條 CMD 命令。執行的命令和參數當指定多個時,只有最後一個起效。

- CMD ["executable", "參數1","參數2"]:使用 exec 方式執行,推薦。

- CMD command 參數1 參數2:shell 方式執行。

- CMD ["參數1","參數2"]:提供給 ENTRYPOINT 做默認參數。

ENTRYPOINT:指定容器的「入口」。支持兩種格式,默認不會被 docker run 指定的參數覆蓋。可以指定 --entrypoint 參數去覆蓋。每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

- ENTRYPOINT ["executable", "參數1","參數2"]:使用 exec 方式執行。推薦 - ENTRYPOINT command 參數1 參數2:shell 方式執行。

shell 方式下不能接受 CMD 的參數。

HEALTHCHECK:Docker 1.12版本後引入的判斷容器運行狀態是否正常。

通過上面對指令的了解後,我們最後通過一個小小的 demo 來給大家演示一下怎麼組合使用這些指令。 

1.新建一個 index.html 文件,內容

2.新建 Dockerfile 文件

# 基於 nginx:1.17.9 鏡像構建FROM nginx:1.17.9
# 指定信息LABEL maintainer="hogwarts@testing-studio.com>"
# 設置環境變量ENV NGINX_VERSION 1.17.9
# 切換 root 用戶USER root
# 執行命令,安裝 curl 軟體,設置軟連結把 nginx 服務的日誌顯示到終端輸出上。RUN apt-get -yq update && apt-get install -y curl && \ln -sf /dev/stdout /var/log/nginx/access.log && \ln -sf /dev/stderr /var/log/nginx/error.log
# 設置容器內 /data 目錄為匿名卷VOLUME ["/data"]
# 設置工作目錄WORKDIR /data/html/
# 複製 index.html 文件到 WORKDIR 目錄下。COPY index.html .
# 映射 80 埠EXPOSE 80
# 此處 CMD 作為 ENTRYPOINT 的參數。# CMD ["nginx", "-g", "daemon off;"]CMD ["-g", "daemon off;"]
# 設置容器啟動的命令ENTRYPOINT ["nginx"]
# 檢查容器健康,通過訪問 Nginx 服務 80 埠,來判斷容器服務是否運行正常。HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -fs http://localhost/ || exit 1

3.構建鏡像


4.運行容器

docker run --name nv1 -p 8080:80 n:v1

啟動後,HEALTHCHECK 就會5秒鐘訪問一次 Nginx 服務,來確保容器運行的狀態。


服務正常的狀態。COMMAND 欄顯示的命令,為 ENTRYPOINT 指令和 CMD 指令合併後的命令。

5.進入容器,驗證結果。

- exec:執行命令 - it:交互式 tty 終端 - nv1:容器啟動的名字 - bash:使用的 shell 類型

進入容器後,默認會切換到 /data/html 目錄,這個是 WORKDIR 指令指定的目錄。

可以使用 id 命令查看當前用戶信息,顯示為 root。這個是 USER 指令指定的用戶。

使用 ls 命令來查看當前目錄的文件,會看到 index.html 文件,這個是 COPY 指令複製到容器的文件。

使用 env 命令可以查看當前環境下有一個變量 NGINX_VERSION=1.17.9 這個是 ENV 指令指定的信息。

項目的鏡像的內容就先說到這裡,對Docker commit、Dockerfile是不是有了更多一些的了解了呢?

內容全面升級,4 個月 20+ 項目實戰強化訓練,資深測試架構師、開源項目作者親授 BAT 大廠前沿最佳實踐,帶你一站式掌握測試開發必備核心技能(對標阿里P6+,年薪50W+)!直推 BAT 名企測試經理,普遍漲薪 50%+!

⬇️ 點擊「閱讀原文」,提升測試核心競爭力!

相關焦點

  • docker容器dockerfile詳解
    docker通過UnionFS聯合文件系統將鏡像的分層實現合併,關於鏡像相關知識有興趣的同學可參考我們之前文章docker容器技術基礎之聯合文件系統OverlayFS[1]本文是對docker官方文檔Dockerfile reference[2]學習與實踐,在學習docker容器相關技術的同學別光收藏,你要動起來!實踐起來!
  • 雲計算核心技術Docker教程:Dockerfile指令詳解
    來源:TechWeb.com.cnDockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。COPY複製指令,從上下文目錄中複製文件或者目錄到容器裡指定路徑。CMD類似於 RUN 指令,用於運行程序,但二者運行的時間點不同:CMD 在docker run 時運行。RUN 是在 docker build。
  • IT工程師都需要掌握的容器技術之Dockerfile
    Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明,每條指令對應Linux下面的一條命令。docker能夠讀取dockerfile的指令進行自動構建容器,基於dockerfile製作鏡像,每一個指令都會創建一個鏡像層,即鏡像層是多層疊加的,不過鏡像層數越多,效率越低。
  • Docker 快速入門之 Dockerfile
    答案當然是可以的,在 Docker 中我們可以從名為 Dockerfile 的文件中讀取指令並且自動構建鏡像。在本文中,將介紹 Dockerfile 的基本語法以及基本知識。1、Dockerfile 是什麼?Dockerfile 其實是一份文本文檔,裡面包含了用戶可以用來操作鏡像的一些指令。
  • Docker基礎篇(Dockerfile)-雲原生核心
    編寫Dockerfile文件)A --> D(2. docker build)A --> E(3. docker run)腳本文件的樣式,以centos為例在這裡插入圖片描述腳本文件內容FROM scratchADD centos-7-x86_64-docker.tar.xz /LABEL
  • Dockerfile官方文檔詳細介紹
    在Docker守護程序運行中的指令之前Dockerfile,它會對進行初步驗證,Dockerfile如果語法不正確,則返回錯誤:$ docker build -t test/myapp .語法指令定義用於構建當前Dockerfile的Dockerfile構建器的位置。BuildKit後端允許無縫使用構建器的外部實現,這些構建器以Docker映像的形式分發並在容器沙箱環境中執行。
  • Dockerfile 常用指令 - 每天5分鐘玩轉 Docker 容器技術(16)
  • Dockerfile文件全面詳解
    可以使用 --no-cache 標誌使指令緩存無效Dockerfile 的指令每執行一次都會在 Docker 上新建一層。COPY 指令和 ADD 指令的唯一區別在於:是否支持從遠程URL獲取資源。COPY 指令只能從執行 docker build 所在的主機上讀取資源並複製到鏡像中。而 ADD 指令還支持通過 URL 從遠程伺服器讀取資源並複製到鏡像中。相同需求時,推薦使用 COPY 指令。ADD 指令更擅長讀取本地tar文件並解壓縮。
  • Dockerfile常用使用方法
    Docker從Dockerfile中讀取指令,以自動執行原本手動執行的步驟來創建映像。要構建鏡像,請創建一個名為Dockerfile的文件。Dockerfile描述了組裝映像所需的步驟。創建Dockerfile後,調用docker build命令,使用包含Dockerfile的目錄的路徑作為參數。
  • Dockerfile最佳實踐
    在容器領域,docker 公司提出的容器鏡像已經成為目前容器打包交付的事實標準。構建鏡像需要編寫 Dockerfile,如何編寫一個優雅的 Dockerfile 呢?在 Docker 公司的官方文檔中給出了一篇  Best practices for writing Dockerfiles。
  • Docker指令詳解&最佳實踐&面試問題
    docker已成為現在流行的一個開源容器引擎,我們在工作中也經常要與其打交道。這篇文章將
  • dockerfile中ENTRYPOINT與CMD的結合
    一、寫在前面我們在上篇小作文docker容器dockerfile詳解[1]對中dockerfile有了比較全面的認識,我們也提到ENTRYPOINT和CMD
  • 雲計算核心技術Docker教程:Dockerfile文件EXPOSE命令詳解
    Dockerfile文件EXPOSE 指令是聲明運行時容器提供服務埠,這只是一個聲明,在運行時並不會因為這個聲明應用就會開啟這個埠的服務。語法格式EXPOSE 埠1 [埠2...]
  • 現代程式設計師必須掌握的:Dockerfile 與 Compose 環境搭建學習筆記(二)
    其實 https://hub.docker.com/ 上面各種基礎鏡像非常完善,特別是官方的鏡像質量非常之高,而我再搗騰一次完全是為了讓自己掌握 Dockerfile 方面的技能而已。在選擇基礎鏡像方面,推薦使用 Alpine ,然後再它上面進行定製,因為它非常的小僅3M。
  • 雲計算核心技術Docker教程:Dockerfile文件ARG命令詳解
    Dockerfile 中的 ARG 指令是定義參數名稱,以及定義其默認值。該默認值可以在構建命令 docker build 中用 --build-arg 參數名=值 來覆蓋。
  • 雲計算核心技術Docker教程:Dockerfile文件CMD命令詳解
    Dockerfile文件ADD指令是用於指定默認的容器主進程的啟動命令。Docker 不是虛擬機,容器就是進程。既然是進程,那麼在啟動容器的時候,需要指定所運行的程序及參數。
  • Dockerfile 文件全面詳解
    如果您省略其中任何一個,構建器默認使用一個 latest 標籤。如果找不到該 tag 值,構建器將返回錯誤。--platform 標誌可用於在 FROM 引用多平臺鏡像的情況下指定平臺。例如,linux/amd64、linux/arm64、 或 windows/amd64。
  • Docker小白到實戰之Dockerfile解析及實戰演示,果然順手
    前言使用第三方鏡像肯定不是學習Docker的最終目的,最想要的還是自己構建鏡像;將自己的程序、文件、環境等構建成自己想要的應用鏡像,方便後續部署、啟動和維護;而Dockerfile就是專門做這個事的,通過類似簡單編碼的形式,最終就可以構建出屬於自己的鏡像,所以必須學起來。正文1.
  • Dockerfile與Docker構建流程解讀
    docker build的流程(這部分代碼基本都在docker/builder中)1.提取Dockerfile(evaluator.go/RUN)。2.將Dockerfile按行進行分析(parser/parser.go/Parse) Dockerfile,每行第一個單詞,如CMD、FROM等,這個叫做command。
  • 雲計算核心技術Docker教程:Docker Compose yml常用配置指令簡介
    YAML 的語法和其他高級語言類似,並且可以簡單表達清單、散列表,標量等數據形態。它使用空白符號縮進和大量依賴外觀的特色,特別適合用來表達或編輯數據結構、各種配置文件、傾印調試內容、文件大綱。Docker Compose 默認使用文件名 docker-compose.yml,例如以下就是一個docker-compose.yml文件示例:version:指定本 yml 依從的 compose 哪個版本制定的services:用於定義不同的應用服務,上例中分別定義了兩個服務