docker教程-dockerfile語法
-
FROM關鍵字
指定基礎映象,並且必須是第一條指令。如果不以任何映象為基礎,那麼寫法為:FROM scratch。同時意味著接下來所寫的指令將作為映象的第一層開始,語法:
FROM <image> FROM <image>:<tag> FROM <image>:<digest>
三種寫法,其中<tag>和<digest> 是可選項,如果沒有選擇,那麼預設值為latest,為了安全,儘量使用官方image作為base image
例:
FROM scratch #製作base image FROM centos #以centos作為base image
-
LABEL關鍵字
為映象指定標籤,語法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
一個Dockerfile種可以有多個LABEL,如下:
LABEL "com.example.vendor"="ACME Incorporated" LABEL com.example.label-with-value="foo" LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines."
但是並不建議這樣寫,最好就寫成一行,如太長需要換行的話則使用\符號
如下:
LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3"
說明:LABEL會繼承基礎映象種的LABEL,如遇到key相同,則值覆蓋
例:
LABEL maintainer="[email protected]" #維護者資訊
LABEL version="1.0" #版本
LABEL description="這是描述" #映象描述資訊
-
RUN關鍵字
功能為執行指定的命令,每執行一次RUN對image而言都生成新的一層,RUN命令有兩種格式
1. RUN <command>
2. RUN ["executable", "param1", "param2"]
第一種後邊直接跟shell命令
-
在linux作業系統上預設 /bin/sh -c
-
在windows作業系統上預設 cmd /S /C
第二種是類似於函式呼叫。可將executable理解成為可執行檔案,後面就是兩個引數。
兩種寫法比對:
-
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
-
RUN ["/bin/bash", "-c", "echo hello"]
注意:多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層.多少個RUN就構建了多少層映象,會造成映象的臃腫、多層,不僅僅增加了構件部署的時間,還容易出錯。
當命令較多,或較長時,建議將命令換行,RUN書寫時的換行符是 \
例:
RUN yum update && yum install -y vim \
python-dev
RUN apt-get update && apt-get install -y perl \
pwgen --no-install-recommends && rm -rf \
/var/lib/apt/list/*
-
WORKDIR關鍵字
設定工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。相當於 cd,如果不存在要開啟的目錄則會建立,可以設定多次。語法:
WORKDIR /path/to/workdir
例:
WORKDIR /ROOT #將工作目錄切換到root下
WORKDIR /test #將工作目錄切換到test目錄 沒有則建立
WORKDIR demo #結合上一句 此時工作目錄被切換到/test/demo目錄下
儘量使用WORKDIR,而不使用RUN cd,儘量使用局對目錄。
-
ADD關鍵字
一個複製命令,把檔案複製到映象中。如果把宿主機與容器想象成兩臺linux伺服器的話,那麼這個命令就類似於scp,只是scp需要加使用者名稱和密碼的許可權驗證,而ADD不用。語法如下:
1. ADD <src>... <dest> 2. ADD ["<src>",... "<dest>"]
<dest>路徑的填寫可以是容器內的絕對路徑,也可以是相對於工作目錄的相對路徑
<src>可以是一個本地檔案或者是一個本地壓縮檔案,還可以是一個url,如果把<src>寫成一個url,那麼ADD就類似於wget命令,ADD不僅可以新增一個檔案到指定目錄,而且還可以將新增的壓縮檔案解壓縮,
如以下寫法都是可以的:
-
ADD test relativeDir/ #將test複製到容器內,相對於當前工作目錄下的relativeDir目錄中
-
ADD test /relativeDir #將test複製到容器內根目錄下relativeDir目錄中
-
ADD http://example.com/foobar / #將網路檔案下載到根目錄下
儘量不要把<scr>寫成一個資料夾,如果<src>是一個檔案夾了,將複製整個目錄的內容,包括檔案系統元資料
有如下注意事項:
1、如果源路徑是個檔案,且目標路徑是以 / 結尾, 則docker會把目標路徑當作一個目錄,會把原始檔拷貝到該目錄下。如果目標路徑不存在,則會自動建立目標路徑。
2、如果源路徑是個檔案,且目標路徑是不是以 / 結尾,則docker會把目標路徑當作一個檔案。如果目標路徑不存在,會以目標路徑為名建立一個檔案,內容同源檔案;如果目標檔案是個存在的檔案,會用原始檔覆蓋它,當然只是內容覆蓋,檔名還是目標檔名。如果目標檔案實際是個存在的目錄,則會原始檔拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結尾,以避免混淆。
3、如果源路徑是個目錄,且目標路徑不存在,則docker會自動以目標路徑建立一個目錄,把源路徑目錄下的檔案拷貝進來。如果目標路徑是個已經存在的目錄,則docker會把源路徑目錄下的檔案拷貝到該目錄下。
4、如果原始檔是個歸檔檔案(壓縮檔案),則docker會自動幫解壓。
-
COPY關鍵字
看這個名字就知道,又是一個複製命令,與ADD用法基本相同,COPY的<src>只能是本地檔案,語法如下:
1. COPY <src>... <dest> 2. COPY ["<src>",... "<dest>"]
例:
ADD hello / #將hello檔案複製到容器內根目錄下
ADD test.tar.gz / #將壓縮檔案新增到容器內根目錄下並解壓
WORKDIR /root #將工作目錄切換到root目錄下
ADD hello test/ #將hello檔案新增到/root/test目錄下
WORKDIR /root #將工作目錄切換到root目錄下
copy hello test/ #將hello檔案複製到/root/test
-
ENV關鍵字
功能為設定環境變數設定常量,語法有兩種:
1. ENV <key> <value> 2. ENV <key>=<value> ...
兩者的區別就是第一種是一次設定一個,第二種是一次設定多個。
例:
ENV MYSQL_VERSION 5.6 #設定常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \ #使用常量
&& rm -rf /var/lib/apt/list/*