1. 程式人生 > >dockerfile創建鏡像

dockerfile創建鏡像

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創建鏡像