1. 程式人生 > >docker教程-dockerfile語法

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/*