Dockerfiledocker
Dockerfile 指令介紹shell
FROM數組
FROM指令是最重要的一個且必須爲Dockerfile文件開篇的第一個非註釋行,用於爲映像文件構建過程指定基準鏡像,後續的指令運行於此基準鏡像所提供的運行環境tcp
實踐中,基準鏡像能夠是任何可用鏡像文件,默認狀況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從Docker Hub Registry上拉取所需的鏡像文件(若是找不到指定的鏡像文件,docker build會返回一個錯誤信息)ide
語法:ui
FROM <regository>[:<tag>]或spa
FROM <regository>@<digest>命令行
MAINTAINER遞歸
用於讓Dockerfile製做者提供本人的詳細信息進程
Dockerfile不限定MAINTAINER指令出現的位置,但推薦將其放置於FROM指令以後
語法:
MAINTAINER "liheng <liheng@anchnet.com>"
COPY
用於從Docker主機複製文件至建立的新映像文件
語法:
COPY <src> ... <dest>或
COPY ["<src>",... 「<dest>」]
<src>:要複製的源文件或者目錄,支持使用通配符
<dest>:目標路徑,即正在建立的image的文件系統路徑;建議爲<dest>使用絕對路徑,不然,COPY指定則以WORKDIR爲其起始路徑。
文件複製準則:
一、<src>必須是build上下文中的路徑,不能是其父目錄中的文件
二、若是<src>是目錄,則其內部文件或子目錄會被遞歸複製,但<src>目錄自身不會被複制
三、若是指定了多個<src>,或者在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以/結尾
四、若是<dest>事先不存在,它將會被自動建立,這包括其父目錄路徑
ADD
ADD指令相似於COPY指令,ADD支持使用TAR文件和URL路徑
語法:
ADD <src> ... <dest>或
ADD ["<src>",... "<dest>"]
操做準則
一、同COPY指令;
二、若是<src>爲URL且不以/結尾,則<src>指定的文件將被下載並直接被建立爲<dest>;若是<dest>以/結尾,則文件名URL指定的文件將被直接下載並保存爲<dest>/<filename>;
三、若是<src>是一個本地系統上的壓縮格式的rar文件,它將被展開爲一個目錄,其行爲相似於"tar -x"命令;然而,經過URL獲取到的tar文件將不會自動展開;
四、若是<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/結尾的目錄路徑;若是<dest>不以/結尾,則其被視做一個普通文件,<src>的內容將被直接寫入到<dest>;
WORKDIR
用於爲Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY、ADD指定設定的工做目錄
語法:
WORKDIR <DIRPATH>
一、在Dockerfile文件中,WORKDIR指令可出現屢次,其路徑也能夠是相對路徑,不過,其是相對於此前一個WORKDIR指令指定的路徑
二、另外,WORKDIR也可調用ENV指定定義的變量
例如:
WORKDIR /var/log
WORKDIR $STATEPATH
VOLUME
用於在image中建立一個掛載點目錄,以掛載Docker host上的卷或其餘容器上的卷
語法:
VOLUME <mountpoint>或
VOLUME ["<mountpoint>"]
若是掛載點目錄路徑下此前的文件存在,docker run命令會在卷掛載完成後將此前的全部文件複製到新掛載的卷中
EXPOSE
用於爲容器打開指定要監聽的端口以實現與外部通訊
語法:
EXPOSE <port>[/<protocol>] <port>[/<protocol>] ...
<protocol>用於指定傳輸層協議,可爲tcp或udp兩者之一,默認爲TCP協議
EXPOSE指令可一次指定多個端口,例如:
EXPOSE 11211/udp 11211/tcp
ENV
用於爲鏡像定義所需的環境變量,並可被Dockerfile文件中位於其後的其餘指令(ENV、ADD、COPY等)所調用.
調用格式:$variable_name或${variable_name}
語法:
ENV <key> <value>或
ENV <key>=<value> ...
第一種格式中,<key>以後的全部內容均會被視做其<value>的組成部分,所以,一次只能設置一個變量;
第二種格式可用一次設置多個變量,每一個變量爲一個"<key>=<value>"的鍵值對,若是<value>中包含空格,能夠以反斜線\進行轉義,也可經過對<value>加引號進行標識;另外反斜線也可用於續行;
定義多個變量時,建議使用第二種方式,以便在同一層中完成全部功能
RUN
用於指定docker build過程當中運行的程序,起能夠是任何命令
語法:
RUN <command>或
RUN ["<executable>","<param1>","<param2>"]
一、第一種格式中,<command>一般是一個shell命令,且以"/bin/sh -c"來運行它,這意味着此進程在容器中的PID不爲1,不能接收Unix信號,所以,當使用docker stop <container>命令中止容器時,此進程接收不到SIGTERM信號;
二、第二種語法格式中的參數是一個JSON格式的數組,其中<executable>爲要運行的命令,後面的<paramN>爲傳遞給命令的選項或參數;然而,此種格式指令的命令不會以"/bin/sh -c"來發起,所以常見的shell操做如變量替換以及通配符(?,*等)替換等將不會進行;不過,要運行的命令依賴於此shell特性的話,能夠將其替換爲相似下面的格式:
RUN ["/bin/sh","-c","<executable>","<param1>"]
CMD
相似於RUN指令,CMD指令也可用於運行任何命令或應用程序,不過,兩者的運行時間點不一樣
一、RUN指令運行與映像文件構建過程當中,而CMD指令運行於基於Dockerfile構建出的新映像文件啓動一個容器時
二、CMD指令的首要目的在於爲啓動的容器指定默認要運行的程序,且其運行結束後,容器也將終止;不過,CMD指定的命令其能夠被docket run的命令行選項所覆蓋
三、在Dockerfile中能夠出現多個CMD指令,但僅最後一個會生效
語法:
CMD <command>或
CMD ["<executable>","<param1>","<param2>"]或
CMD ["<param1>","<param2>"]
前兩種的語法格式的意義同RUN
第三種則用於爲ENTRYPOINT指令提供默認參數