Dockerfile指令介紹

Dockerfile

Dockerfile 指令介紹

FROM

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

實踐中,基準鏡像可以是任何可用鏡像文件,默認情況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從Docker Hub Registry上拉取所需的鏡像文件(如果找不到指定的鏡像文件,docker build會返回一個錯誤信息)

語法:

FROM <regository>[:<tag>]或

FROM <regository>@<digest>


MAINTAINER

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

Dockerfile不限定MAINTAINER指令出現的位置,但推薦將其放置於FROM指令之後

語法:

MAINTAINER "liheng <[email protected]>"


COPY

用於從Docker主機複製文件至創建的新映像文件

語法:

COPY <src> ... <dest>或

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

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

<dest>:目標路徑,即正在創建的image的文件系統路徑;建議爲<dest>使用絕對路徑,否則,COPY指定則以WORKDIR爲其起始路徑。

文件複製準則:

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

2、如果<src>是目錄,則其內部文件或子目錄會被遞歸複製,但<src>目錄自身不會被複制

3、如果指定了多個<src>,或者在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以/結尾

4、如果<dest>事先不存在,它將會被自動創建,這包括其父目錄路徑


ADD

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

語法:

ADD <src> ... <dest>或

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

操作準則

1、同COPY指令;

2、如果<src>爲URL且不以/結尾,則<src>指定的文件將被下載並直接被創建爲<dest>;如果<dest>以/結尾,則文件名URL指定的文件將被直接下載並保存爲<dest>/<filename>;

3、如果<src>是一個本地系統上的壓縮格式的rar文件,它將被展開爲一個目錄,其行爲類似於"tar -x"命令;然而,通過URL獲取到的tar文件將不會自動展開;

4、如果<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/結尾的目錄路徑;如果<dest>不以/結尾,則其被視作一個普通文件,<src>的內容將被直接寫入到<dest>;

WORKDIR

用於爲Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY、ADD指定設定的工作目錄

語法:

WORKDIR <DIRPATH>

1、在Dockerfile文件中,WORKDIR指令可出現多次,其路徑也可以是相對路徑,不過,其是相對於此前一個WORKDIR指令指定的路徑

2、另外,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>"]

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

2、第二種語法格式中的參數是一個JSON格式的數組,其中<executable>爲要運行的命令,後面的<paramN>爲傳遞給命令的選項或參數;然而,此種格式指令的命令不會以"/bin/sh -c"來發起,因此常見的shell操作如變量替換以及通配符(?,*等)替換等將不會進行;不過,要運行的命令依賴於此shell特性的話,可以將其替換爲類似下面的格式:

RUN ["/bin/sh","-c","<executable>","<param1>"]


CMD

類似於RUN指令,CMD指令也可用於運行任何命令或應用程序,不過,二者的運行時間點不同

1、RUN指令運行與映像文件構建過程中,而CMD指令運行於基於Dockerfile構建出的新映像文件啓動一個容器時

2、CMD指令的首要目的在於爲啓動的容器指定默認要運行的程序,且其運行結束後,容器也將終止;不過,CMD指定的命令其可以被docket run的命令行選項所覆蓋

3、在Dockerfile中可以出現多個CMD指令,但僅最後一個會生效

語法:

CMD <command>或

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

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

前兩種的語法格式的意義同RUN

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章