在《力薦!小裁縫Docker系列(三):如何讓鏡像“run”起來》這篇文章中,主要介紹了要如何通過鏡像啟動一個容器,我們用了topline/xiaocaifeng/spring-boot-mongo這個鏡像,這個鏡像是小編通過docker run命令構建出來的,這篇文章我們將介紹如何構建鏡像。
我們先主要講解下,構建鏡像所需的Dockerfile文件,最後我們通過一個例子來講解如何構建鏡像。
Docker可以根據Dockerfile中定義的各個指令來構建鏡像,因此我們這篇文章將著重講解Dockerfile中常用的指令。
我們先看下小編構建之前鏡像所寫的Dockerfile:
從上圖可以看出,在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指令將在當前鏡像之上的層中執行並且提交執行結果,在接下來的構建過程中可以使用該結果。
示例
到這裡如何通過Dockerfile構建鏡像就結束了,主要還是要熟悉理解每個指令的含義,謝謝大家的閱讀,有什麼建議希望可以在留言評論。