小裁縫Docker系列(四):如何構建鏡像

Docker 腳本語言 文章 技術 小裁縫先生 小裁縫先生 2017-08-31

小裁縫Docker系列(四):如何構建鏡像

《力薦!小裁縫Docker系列(三):如何讓鏡像“run”起來》這篇文章中,主要介紹了要如何通過鏡像啟動一個容器,我們用了topline/xiaocaifeng/spring-boot-mongo這個鏡像,這個鏡像是小編通過docker run命令構建出來的,這篇文章我們將介紹如何構建鏡像。

我們先主要講解下,構建鏡像所需的Dockerfile文件,最後我們通過一個例子來講解如何構建鏡像。

Docker可以根據Dockerfile中定義的各個指令來構建鏡像,因此我們這篇文章將著重講解Dockerfile中常用的指令。

我們先看下小編構建之前鏡像所寫的Dockerfile:

小裁縫Docker系列(四):如何構建鏡像

從上圖可以看出,在Dockerfile中指令規範為大寫,參數為小寫,#一般情況下用來註釋,{}用來引用變量,對Dockerfile有了大概的瞭解之後,我們再分析這些指令。

FROM

選擇一個基礎鏡像作為新的鏡像的基礎,後續的指令也在這個鏡像之上。通常情況下,一個格式正確的Dockerfile應該是以FROM指令開始的。如果設置的鏡像本地沒有,docker會自動去下載。

MAINTAINER

用來描述構建這個鏡像的作者或者團隊,但是對於這樣的信息使用LABEL指令更加的適合。

LABEL

LABEL指令用於給鏡像加上元數據,其語法為:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

一個鏡像可以有一個或多個LABEL,但是因為一個LABEL會產生一個層,如果太多會對鏡像本身產生影響,因此建議使用一個LABEL

LABEL multi.label1="value1" multi.label2="value2" other="value3"

可以通過 docker inspect “imageID”來查看標籤。

ARG

ARG <name>[=<default value>]

ARG指令定義了一個變量(可以設置默認值,如果build命令沒有傳遞則取默認值),用戶可以在docker build命令中通過 --bulid-args<varname>=<value>進行傳遞。如果傳遞的參數名在Dockerfile中沒有設置會出現警告。因為構建時變量可以通過docker history命令查看到,因此對於密碼之類的敏感信息不建議通過ARG指令傳遞。另外只有定義在ARG後面的指令才可以通過${arg}獲取到值。

另外,Docker也提供了一些預置的ARG,HTTP_PROXY,HTTPS_PROXY,FTP_PROXY,NO_PROXY.

ENV

ENV <key> <value> // 設置一個環境變量

跟ALBEL類似,建議只使用一個ENV指令,因為每個ENV指令都會產生一個曾(layer)。

在Dockerfile中使用ENV指令定義的變量可以使用${...},ENV變量可以設置默認值,如果想替換則在docker run 啟動容器時,使用-e 設定(在前一篇Docker第三篇文章中有提到)。

ADD

ADD <src>... <dest> <src>表示將要拷貝的文件(夾)的路徑(URL) <dest>表示鏡像內部的路徑

ADD ["<src>",... "<dest>"] 在路徑中包含空格時必須使用這種語法

  • ADD指令拷貝文件,文件夾或者遠程文件並將他們添加到鏡像內部的目錄

  • 對於<src>是文件(夾)路徑,必須相對於build的上下文,(可以理解為相對於Dockerfile目錄

  • 對於"[","]"這樣的特殊字符,需要進行轉義,格式為[[]]

  • 當<src>為目錄時,將只拷貝目錄下的內容

  • 當<src>為一個真正意義上的壓縮文件(而不是隻是名字為壓縮文件格式)時,將自動解壓文件

  • <dest>是一個絕對路徑,如果目標路徑不是以"/"開頭,它將文件拷貝到‘WORKDIR’/destdir/

  • 如果<dest>指定的目錄不存在,docker會自動創建缺失的目錄

COPY

這個指令跟ADD差不多,可以參照COPY指令

WORKDIR

WORKDIR /path/to/workdir

WORKDIR指令設置工作目錄,其他的指令(RUN ,CMD,ENTRYPOINT,COPY以及ADD)都在這個工作目錄中工作。如果指令指定的目錄不存在,docker會自動創建。

WORKDIR在Dockerfile中可以使用多次,如果第一個指令使用了相對路徑,那麼接下來的指令指定的目錄都是相對於它。

WORKDIR /a

WORK b

WORK C

RUN pwd

結果將輸出:/a/b/c

在WORKDIR指令中也可以使用

ENV DIRPATH /path

WORKDIR $DIRPATH

CMD

CMD指令有三種形式

CMD ["executable",‘param1“,"param2"]

CMD["param1","param2"]

CMD command param1 param2 // shell腳本格式,上面示例中也用的這種格式

一個Dockerfile中只可以出現一個指令,如果出現多個只有最後一個會起作用。CMD的目的是為執行容器設置默認值。

RUN

RUN指令的格式

RUN <command>

RUN [”executable“,"params1","params2"]

RUN指令將在當前鏡像之上的層中執行並且提交執行結果,在接下來的構建過程中可以使用該結果。

示例

小裁縫Docker系列(四):如何構建鏡像

dockerfile

小裁縫Docker系列(四):如何構建鏡像

執行結果

小裁縫Docker系列(四):如何構建鏡像

通過docker images查詢

到這裡如何通過Dockerfile構建鏡像就結束了,主要還是要熟悉理解每個指令的含義,謝謝大家的閱讀,有什麼建議希望可以在留言評論。

相關推薦

推薦中...