Docker配置指南(三):Dockerfile(一)

來源:互聯網
上載者:User

標籤:docker 協助 docker命令解釋 dockerfile

Dockerfile功能以及其工作流程

    docker可以通過自動閱讀dockerfile檔案建立鏡像,dockerfile是一個文字文件型的,所有使用者能在命令列進行的操作命令都可以在此定義,從而將這些命令組合起來,並產生一個直接可用的鏡像。使用“docker build”,使用者可以連續執行多個指令,從而實現構建的自動化。本文將會介紹在dockerfile中可以執行的命令參數。

    docker build命令可以從一個dockerfile或者一個文本構建鏡像,構建文本可以是一個本地路徑或者是一個GIT的URL路徑。"docker build ."表示使用目前的目錄作為上下文進行構建(警告,不要在根目錄執行此命令,這將會把你的硬碟的上下文資訊全部傳送到docker進程當中,自己想想後果吧),預設情況下,如果不使用-f選項指定,會載入名為Dockerfiler的檔案。然後可以使用-t選項指定構建鏡像的tag標籤以及倉庫名稱,例如(可以添加多個參數):

        docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .

    docker的構建操作是由docker守護進程完成的,而非CLI(命令列操作)。其構建順序是,首先把上下文資訊發送到進程,然後docker守護進程將會依次執行Dockerfile裡面的指令到新的鏡像當中,並且會在結束後自動清除上下文資訊。為了提升Docker效能,還可以在上下文目錄添加一個".dockerignore"檔案。需要注意的是,Dockerfile中的每一條指令都是完全獨立的,也就是說你不能指望通過"RUN cd /tmp"指令,將下一條指令的工作環境設定到"/tmp"目錄下面。

    docker會盡量使用鏡像緩衝(預設),從而提高其工作效能。當然,也可以通過"--no-cache=true"不使用緩衝構建。構建完成後,就可以通過push指令上傳到指定註冊中心的倉庫了。

Dockerfile寫作風格:

    一,基本文法

    # Comment 

    INSTRUCTION arguments

    "INSTRUCTION"是不區分大小寫,但是為了區分起見,以大寫為好。Dockerfile每一行僅支援一條指令,Dockerfile的起始位置的第一個非注釋行需要使用"FROM"指令指定構建使用的來源鏡像,指令地區的起始最好有以"#"的注釋行,以說明目前範圍執行的任務內容。

    二,變數置換

  • 在dockerfile中,變數聲明可以表示為$variable_name或者${variable_name},主要是用來區別沒有空格的變數,例如${foo}_bar。

  • dockerfile中的變數聲明也支援少量的bash修飾符,例如:

    • ${variable_name:+word}:    如果已經賦值且非空,則使用$variable_name的值,如果沒有,則返回Null 字元串

    • ${variable_name:-word}:    如果已經賦值,則使用$variable_name的值,如果沒有,使用word

  • word可以為任一字元串,包含附加的環境變數

  • 也可以使用"\"符號進行轉義,例如"\$foo"表示內容就是"$foo"

  • 環境變數可以在以下指令中使用:

    • ADD|COPY|ENV|EXPOSE|LABEL|USER|WORKDIR|VOLUME|STOPSIGNAL

    • 也可以使用ONBUILD指令(需要docker版本大於1.4)

  • 環境變數支援替換

    三,dockerignore file

    在docker執行命令(發送上下文資訊到進程之前)時,如果存在".dockerignore"檔案,則其中定義的檔案或目錄不ADD或COPY指令添加到鏡像當中。例如:

        */temp*    #如,/aa/template.txt

        */*/temp*    #如,/aa/bb/template.conf

        temp?    #如,/tempaa或/tempbb

        *.md

        !README.md    #取反,這兩行結合使用,表示包含所有以.md結尾的,除了README.md以外的檔案

    使用匹配格式都參照go語言風格

Dockerfile指令說明:

  • FROM

    • 作用:指令構建來源鏡像,它必須處於第一個非注釋指令

    • 文法:FROM <image> 或者 FROM <image>:<tag> 或者 FROM <image>@<digest>,後兩個(標籤和摘要)是可選的,如果無法匹配,則返回錯誤

  • MAINTAINER

    • 作用:指定產生鏡像的作者

    • 文法:MAINTAIN <name>

  • RUN

    • 作用:在引用的的鏡像中執行命令,交提交結果,用於dockerfile後面的操作

    • 文法:RUN有兩種寫法

      • RUN <command>

      • RUN ["executable", "param1", "param2"]

    • 範例:

      • RUN /bin/bash -c "source $HOME/.bashrc ; echo $HOME" #跨行操作時可以添加反斜線

      • RUN ["/bin/bash", "-c", "echo hello"]

    • 注意事項:

      • RUN指令的部分操作會儲存在緩衝當中,如果下次構建不使用"--no-cache=true",則有可能會出問題

  • CMD

    • 作用:CMD的主要目的是為執行容器提供一些預設參數,這些設定可以包括一個可執行檔,或者一個系統命令。CMD指令只能在dockerfile中存在一次,如果有多條,則只執行最後一條

    • 文法:CMD有三種寫法

      • CMD ["executable", "param1", "param2"]

      • CMD ["param1", "param2"] #此種寫法需要配置ENTRYPOINT指令結合使用,如果兩個都獨立使用,則只會執行最後一個CMD或者ENTRYPOINT指令

      • CMD command param1 param2  #shell風格

  • LABEL

    • 作用:LABEL指令用來添加一些中繼資料到鏡像當中,LABEL是索引值對類型資料,一個鏡像可以有一個或者多個標籤,但是過多的標籤則會導致產生一個低能的鏡像。當指定多個標籤時,盡量在一層顯示,而不是使用多個LABEL指令指定。可以使用docker inspect查看鏡像的LABEL資訊

    • 文法:LABEL <key>=<value> <key>=<value> <key>=<value> <key>=<value> ……

  • EXPOSE

    • 作用:指定容器映射到主機的連接埠,Docker容器的IP是隨機產生的,所以外部存取是需要通過主機連接埠映射訪問的,而EXPOSE指定了其映射到主機的連接埠,具體可參考man docker-run中的-p或者-P選項

    • 文法:EXPOSE <port> [<port>...]

  • ENV

    • 作用:設定環境變數,此處的變數可以在dockerfile中引用 

    • 文法:ENV有兩種寫法

      • ENV <key> <value>

      • ENV <key>=<value> ....  #建議用此種寫法,只產生一個ENV緩衝層

  • ADD

    • 作用:ADD指令可以將源(可以是檔案,目錄或者URL)添加到容器裡面的路徑下,可以使用匹配規則添加檔案。如果是個URL,則會將其下載到容器目標路徑當中

    • 文法:ADD有兩種寫法

      • ADD <src> ... <dest>

      • ADD ["<src>",... <dest>]  #這種形式一般用於包含空格的路徑

  • COPY

    • 作用:COPY是將源檔案或目錄複寫到容器內指定路徑內,如果不攜帶dest參數,則會建立完整的缺失目錄

    • 文法:COPY有兩種寫法

      • COPY <src> ... <dest>

      • COPY ["<src>",... <dest>]  #這種形式一般用於包含空格的路徑

  • ENTRYPOINT

    • 作用:該指令的使用分為兩種情況,一種是自己單獨使用,另一種是和CMD結合使用。結合使用時,ENTRYPOINT指令只能執行命令,但不能指定參數部分;CMD指令不是一個完整的可執行命令,而僅僅是參數部分。例如以下案例:

                        FROM ubuntu  
                        CMD ["-l"]  
                        ENTRYPOINT ["/usr/bin/ls"] 

  • 文法:ENTRYPOINT同樣有兩種文法

    • ENTRYPOINT ["executable", "param1", "param2"]

    • ENTRYPOINT command param1 param2

  • VOLUME

    • 作用:VOLUME指令可以建立一個掛載點給容器使用,從而實現容器內資料的持久化(容器在關閉後資料是會消失的)。卷可以通過docker create 來建立,也可以直接使用docker run建立,卷只能在沒有容器串連時才能被刪除,通過docker run 建立的卷是可以共用給其它容器使用的。例如(有關volume更多介紹,請參考連結:https://docs.docker.com/engine/userguide/containers/dockervolumes/#mount-a-host-directory-as-a-data-volume):

      • docker run -d -P --volume-driver=flocker -v my-named-volume:/opt/webapp --name web training/webapp python app.py

    • 文法:VOLUME [‘/data‘]

  • USER

    • 作用:用以指定使用者名稱或者UID,當使用RUN、CMD和ENTRYPOINT指令的時候,會以此身份進行運行

    • 文法:USER daemon

  • WORKDIR

    • 作用:WORKDIR指令用以設定RUN、CMD和ENTRYPOINT指令的工作目錄

    • 文法:WORKDIR /path/to/workdir

  • ARG

    • 作用:ARG指令定義了一個變數,這個變數可以接受docker build --build-arg <argname>=<value>的入參

    • 文法:ARG <name>[=<default value>]

    • 用例:

      • FROM images1

      • USER ${user:-some_user} 

      • ARG user 

      • USER $user

      • docker build --build-arg user=user_name Dockerfile

  • ONBUILD

    • 作用:ONBUILD指定的指令在構建鏡像時並不會執行,只會在構建其子鏡像時執行

    • 文法:ONBUILD [INSTRUCTION]

  • STOPSIGNAL

    • 作用:STOPSIGNAL用以設定退出狀態代碼,可以是正常的系統訊號,如SIGKILL,也可以是匹配的數字,主機可以通過這個訊號關閉容器

    • 文法:STOPSIGNAL signal


本文出自 “致信” 部落格,請務必保留此出處http://leon0long.blog.51cto.com/3011404/1768324

Docker配置指南(三):Dockerfile(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.