docker 第六篇 dockerfile

 

複習下鏡像生成途徑docker

   Dockerfileshell

   基於容器製做數組

什麼是dockerfile:tcp

  用來構建鏡像的源碼,在配置文件中調用命令,這些命令是用來生成docker鏡像的。ui

dockerfile的語法格式:url

  由兩類組成:命令行

    #Comment 註釋信息對象

    INSTRUCTION arguments    指令和指令參數 (指令大寫爲了區分參數和別的符號)遞歸

    ps: 指令自己不區分大小寫,然而約定俗成要大寫進程

      按順序依次執行

      第一行必須使用 FROM 指定基於哪一個基礎鏡像來實現

      所以:能夠推斷 全部要構建的鏡像都是創建在某個已存在的某個鏡像基礎之上

 

dockerfile工做邏輯

  找一個專用的目錄放dockerfile文件,文件名首字母必須大寫,執行的時候不能有當前文件父目錄,必須基於當前目錄往下走,

  工做目錄下也能夠 建立一個.dockerfile的文件,打包是不會包含此目錄下的文件。 

 

執行方式:

  docker build 執行 

  例如:docker build -t tinyhttpd:v1 ./

  -t: 指構建後寫的名字

  ./ : 當前的dockerfile

製做鏡像時能使用的環境變量

  賦值:變量名=值

  引用:$變量名  或者 ${變量名}

  ${變量名:-word}  表示若是變量的值爲空或未設置,引用後面傳進來的值

  ${變量名:+word} 表示若是變量的值不爲空,則顯示後面的值

 

Dockerfile的指令:

  FROM指定是最重要的一個且必須爲Dockerfile文件開篇的第一個非註釋行,用於爲映像文件構建過程指定基準鏡像,後續的指定運行於次準鏡像所提供的運行環境

  實踐中,基準鏡像能夠是任何可用鏡像文件,默認狀況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從Docker hub registry上拉取所需的鏡像文件

  若是找不到指定的鏡像文件,docker build會返回一個錯誤信息

  語法:

    FROM <repository>[:<tag>] 或 FROM <repository>@<digest>

      <repository>:指定做爲base image的名稱

      <tag>:base image的標籤,爲可選項,省略表示latest

  

  MAINAINER (這是一個可選項)

    用於讓Dockerfile製做人提供本人的詳細信息

    不限制此指令出現的位置,推薦位於FROM以後

    語法:

      MAINTAINER <author's detail>

        <author's detail>但是任何文本信息,但約定俗成使用做者名稱或郵箱

        MAINTAINER "ivy" <ivy@163.com>

    ps: 較新版本中已經把maintainer換成lable了,但依舊兼容

 

  LABLE 讓用戶爲鏡像指定各類各樣的元數據

    語法:

      LABLE <key>=<value>  <key>=<value> ...

 

  COPY

    用於從Docker主機複製文件到建立的映像文件系統中

    語法:

      COPY <src>...<dest> 或

      COPY ["<src>",..."<dest>"]

         <src>: 要複製的源文件目錄,支持使用通配符

        <dest>:目標路徑,即正在建立的image的文件系統路徑,此處建議爲絕對路徑

        ps:若是路徑中有空白字符時,一般使用第二種格式

    文件複製準則:

      <src>必須是build上下文中的路徑,不能是其父目錄中的文件

      若是<src>是目錄,不用加=r選項則其內部文件或子目錄會被遞歸複製,但自身不會被複制

      如之多多個<src>,或者<src>中使用通配符,則dest必須是一個目錄以/結尾

      若是dest事先不存在,它將會被自動建立,包括其父目錄的路徑

      總結:src必須使用相對路徑,dest使用絕對路徑

  ADD

    ADD指令相似於COPY指令,ADD支持使用TAR文件和URL路徑

    語法:

      ADD <src>...<dest> 或

      ADD ["<src>",..."<dest>"]

    操做準則:

      同COPY指令

      若是<src>爲url且<dest>不以/結尾,則<src>指定的文件講被下載並直接被建立爲<dest>,如<dest>以/結尾,則文件名url指定的文件將被直接下載並保存爲<dest>/<filename>

          若是<src>是一個本地系統上的壓縮格式的tar文件,它將被展開爲一個目錄,相似於"tar -x"命令,而經過url獲取的tar文件講不會自動展開

      若是<src> 有多個,或去簡介或直接使用通配符,則<dest> 必須以/結尾

 

  WORKDIR

    用於爲Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY和ADD指定設定工做目錄

    語法:

      WORKDIR <dirpath>

        在dockerfille文件中,WORKDIR指定能夠出現屢次,其路徑也能夠爲相對路徑,不過,其實對象此前一個WORKDIR指定的路徑。

        另外,WORKDIR也可調用由ENV指定定義的變量

    例如:

      WORKDIR /var/log

      WORKDIR $STAATEPATH

 

  VOLUME

    用於在image中建立以一個掛載點目錄,以掛載Docker host 上的卷或其餘容器上的卷

    語法:

      VOLUME  <mountpoint> 或 VOLUME ["mountpoint"]

    r若是掛載點目錄路徑下此前在文件中存在, docker run命令會在卷掛載完成後將此前全部文件複製到新掛載的卷中

    

  EXPOSE

    用於爲容器打開指定要監聽的端口以實現外部通訊

    語法:

      EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]

      <protocol>用於指定傳輸層協議,tcp或udp 默認是tcp

    EXPOAE指令可一次執行多個端口,例如:

      EXPOSE 11211/udp 11211/tcp

  ENV 

    用於爲鏡像定義所需的環境變量,並可被Dockerfile文件中位於其後的其它指定

      (如ENV、ADD、COPY)鎖調用

    調用格式爲$variable_name或${variable_name}

    語法:

      ENV <key><value>或ENV<value>=<value>

    第一種格式中<key> 以後的全部內容均會視其爲<value>的租車鞥部分,所以一次只能設置一個值

    第二個格式可用一次設置多個變量,若是value中包含空格可用\轉義,或雙引號

 

  RUN 

    用於指定docker build過程當中運行的程序,其能夠是任何命令

    語法:

      RUN <command> 或 RUN ["<executable>","<param1>","<param2>"]

    第一種格式中<command>一般是一個shell命令,且以"/bin/sh -c" 來運行,意味着此進程在容器中的PID不爲1,不能接收Unix信號 使用docker <container> stop 來中止容器時 此進程收不到sigterm信號

    第二種語法格式中的參數是一個JSON格式的數組,其中"<executable>"爲要運行的命令,後面的爲要傳遞給命令的選項值,而這種格式指定的命令不會以"/bin/sh -c" 來運行

 

  CMD

    定義一個鏡像文件啓動爲容器時默認要運行的一個程序,能夠給多個,可是隻有最後一個生效

  語法:

    CMD <command>

    CMD ["<executable>","<param1>","<pa>"]

    CMD ["<param1>","<param2>"]

  前兩種語法格式意義同RUN

  第三種則用於ENTERPOINT指令提供默認參數

 

  ENTRYPOINT

    相似CMD指令的功能,用於爲容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序

    與CMD不一樣的是,由ENTRYPOINT啓動的程序不會被docker run 命令行指定的參數覆蓋,並且這些命令行參數會被看成參數傳遞給ENTRYPOINT指定的程序

      可是docker run命令的--entrpoint選項的參數可覆蓋entrypoint指令指定的程序

    語法:

      ENTRYPOINT <COMMAND>

      ENTRYPOINT ["<executable>","<param1>","<param2>"]

    docker run 命令傳入的命令參數會覆蓋CMD指令的內容而且附加到ENTRYPOINT命令最後做爲其參數使用

    Dockerfile文件中也能夠存在多個ENTRYPOINT指令,但僅最後一個生效

 

  USER

    用於指定運行image時或運行dockerfile中任何RUN、CMD或entrypoint指令指定的程序時的用戶UID

    默認狀況下container的運行身份爲root用戶

    語法:

      USER <UID> | <UserName>

      <UID>能夠是任意數字,但實踐中其必須爲/etc/paword中某個用戶的有效UID,不然docker run命令將運行失敗

  HEALTHCHECH

    詳情待補充

  SHELL

  STOPSIGNAL

  ARG

  ONBUILD:

    用於在Dockerfile中定義一個觸發器,

    執行時間:

      作成鏡像之後別人用此鏡像做爲基礎鏡像的時候纔會執行

相關文章
相關標籤/搜索