Docker學習五:Dockerfile

轉載:https://blog.csdn.net/huangjun0210/article/details/85780802

1. FROM

指定基礎鏡像,並且必須是第一條指令,語法如下:

FROM <image>
FROM <image>:<tag>
FROM <image>:<digest> 

三種寫法,其中 < tag>和< digest> 是可選項,如果沒有選擇,那麼默認值爲latest;
儘量使用官方的image作爲base image;
如果不以任何鏡像爲基礎,那麼寫法爲:FROM scratch;
FROM可以在一個Dockerfile中出現多次,以便於創建混合的images。

2. 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相同,則值覆蓋; ②metadata不可少

3. WORKDIR

用於爲Dockerfile中所有RUN、CMD、ENTRYPOINT、COPY和ADD指令設定工作目錄,類似cd,語法爲:

WORKDIR <dirpath>

在Dockerfile文件中,WORKDIR指令可以出現多次,
其路徑也可以爲相對路徑,不過,其是相對此前一個WORKDIR指令指定的路徑,儘量使用絕對路徑。
用WORKDIR,不要用RUN cd。

4. ADD and COPY

都是複製命令,把本地文件天驕到image中。

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

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

路徑的填寫可以是容器內的絕對路徑,也可以是相對於工作目錄的相對路徑。
ADD命令的可以是一個本地文件或者是一個本地壓縮文件,還可以是一個url,COPY的只能是本地文件。
ADD命令的若是壓縮文件,可以解壓縮。
大部分情況,COPY優於ADD,添加遠程文件/目錄請使用curl或者wget

5. ENV

功能爲設置環境變量,定義常量,語法爲:

ENV <key> <value>
ENV <key>=<value> ...

兩者的區別就是第一種是一次設置一個,第二種是一次設置多個。
儘量使用ENV增加可維護性。

6. RUN

運行指定的命令,執行命令並創建新的Image Layer,RUN命令有兩種格式:

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

第一種後邊直接跟shell命令
在linux操作系統上默認 /bin/sh -c
在windows操作系統上默認 cmd /S /C

第二種是類似於函數調用。可將executable理解成爲可執行文件,後面就是兩個參數。
多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層。多少個RUN就構建了多少層鏡像,會造成鏡像的臃腫、多層,不僅僅增加了構件部署的時間,還容易出錯。如太長需要換行的話則使用\符號。

7. CMD

設置容器啓動後默認執行的命令和參數。語法有三種寫法:

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

8. ENTRYPOINT

設置容器啓動時運行的命令。語法如下:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
RUN、CMD and ENTRYPOINT的區別

RUN是構建Image時就運行的命令以及提交運行結果
CMD是容器啓動時執行的命令,在構建Image時並不運行。
如果docker run 指定了其他命令,CMD命令會被忽略
如果定義了多個CMD,只有最後一個會執行
ENTRYPOINT不會被docker run命令指定的參數所覆蓋,一定會執行
如果同時寫了ENTRYPOINT和CMD,並且CMD指令不是一個完整的可執行命令,那麼CMD指令的內容將會作爲ENTRYPOINT的參數
如果同時寫了ENTRYPOINT和CMD,並且CMD是一個完整的指令,那麼它們兩個會互相覆蓋,誰在最後誰生效

9. EXPOSE

爲暴露容器運行時的監聽端口給外部,使容器內的應用可以通過端口和外界交互。語法:

EXPOSE <port> [<port>...]

告訴Docker服務端容器對外映射的本地端口,需要在docker run 的時候使用-p 或者 -P 選項生效。

10. MAINTAINER

作者信息,寫在FROM後。語法:

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