dockerfile用來快速建立自定義鏡像linux
dockerfile分爲部分:基礎鏡像信息,維護者信息,鏡像操做指令,容器啓動時執行指令docker
一開始必須指明所基於的鏡像名稱-》維護者信息-》鏡像操做指令(RUN)->運行容器時的操做命令(CMD)shell
FROM
功能爲指定基礎鏡像,而且必須是第一條指令。
若是不以任何鏡像爲基礎,那麼寫法爲:FROM scratch。
同時意味着接下來所寫的指令將做爲鏡像的第一層開始
語法:
FROM <image> FROM <image>:<tag> FROM <image>:<digest> 三種寫法,其中<tag>和<digest> 是可選項,若是沒有選擇,那麼默認值爲latest
RUN
功能爲運行指定的命令
RUN命令有兩種格式
1. RUN <command>
2. RUN ["executable", "param1", "param2"] 第一種後邊直接跟shell命令 在linux操做系統上默認 /bin/sh -c 在windows操做系統上默認 cmd /S /C 第二種是相似於函數調用。 可將executable理解成爲可執行文件,後面就是兩個參數。 每條RUN指令將在當前鏡像的基礎上執行指定命令,並提交爲新的鏡像 兩種寫法比對: RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME RUN ["/bin/bash", "-c", "echo hello"] 注意:多行命令不要寫多個RUN,緣由是Dockerfile中每個指令都會創建一層. 多少個RUN就構建了多少層鏡像,會形成鏡像的臃腫、多層,不單單增長了構件部署的時間,還容易出錯。 RUN書寫時的換行符是\
CMD
功能爲容器啓動時要運行的命令
語法有三種寫法
1. CMD ["executable","param1","param2"] 2. CMD ["param1","param2"] 3. CMD command param1 param2 第三種比較好理解了,就時shell這種執行方式和寫法 第一種和第二種其實都是可執行文件加上參數的形式 舉例說明兩種寫法: CMD [ "sh", "-c", "echo $HOME" CMD [ "echo", "$HOME" ] 補充細節:這裏邊包括參數的必定要用雙引號,就是",不能是單引號。千萬不能寫成單引號。 緣由是參數傳遞後,docker解析的是一個JSON array
每一個Dockerfile只能有一個CMD命令。若是指定了多條指令,只有最後一條會被執行
若是用戶啓動容器時手動指定了運行的命令(做爲run的參數),則會覆蓋掉CMD指定的命令
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會繼承基礎鏡像種的LABEL,如遇到key相同,則值覆蓋
MAINTAINER
指定做者
語法:
MAINTAINER <name>
EXPOSE
功能爲暴漏容器運行時的監聽端口給外部
可是EXPOSE只是啓動聲明做用,並不會使容器訪問主機的端口
若是想使得容器與主機的端口有映射關係,必須在容器啓動的時候加上 -P參數
ENV
功能爲設置環境變量,在鏡像生成過程當中會被後續RUN指令使用,在鏡像啓動的容器中也會存在
語法有兩種
1. ENV <key> <value>
2. ENV <key>=<value> ... 二者的區別就是第一種是一次設置一個,第二種是一次設置多個
ADD
一個複製命令,把文件複製到景象中。
若是把虛擬機與容器想象成兩臺linux服務器的話,那麼這個命令就相似於scp,只是scp須要加用戶名和密碼的權限驗證,而ADD不用。
語法以下:
1. ADD <src>... <dest>
2. ADD ["<src>",... "<dest>"] <dest>路徑的填寫能夠是容器內的絕對路徑,也能夠是相對於工做目錄的相對路徑 <src>能夠是一個本地文件或者是一個本地壓縮文件,還能夠是一個url 若是把<src>寫成一個url,那麼ADD就相似於wget命令 如如下寫法都是能夠的: ADD test relativeDir/ ADD test /relativeDir ADD http://example.com/foobar / 儘可能不要把<scr>寫成一個文件夾,若是<src>是一個文件夾了,複製整個目錄的內容,包括文件系統元數據
COPY
看這個名字就知道,又是一個複製命令
語法以下:
1. COPY <src>... <dest>
2. COPY ["<src>",... "<dest>"] 與ADD的區別 COPY的<src>只能是本地文件,其餘用法一致