dockerfile創建鏡像
阿新 • • 發佈:2017-08-05
inux 不能 get 函數調用 多層 可選 ble 復制 維護
dockerfile用來快速創建自定義鏡像
基本結構
dockerfile分為部分:基礎鏡像信息,維護者信息,鏡像操作指令,容器啟動時執行指令
一開始必須指明所基於的鏡像名稱-》維護者信息-》鏡像操作指令(RUN)->運行容器時的操作命令(CMD)
指令說明
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>只能是本地文件,其他用法一致
dockerfile創建鏡像