映象的定製實際上就是定製每一層所新增的配置、檔案。我們可以把每一層修改、安裝、構建、操作的命令都寫入乙個指令碼,這個指令碼就是dockerfile。dockerfile是乙個文字檔案,其內包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
該指令指定基礎映象,然後對映象進行定製。
from ubuntu:16.04
docker還存在乙個特殊的映象,名為scratch,它表示乙個空白映象,如果你一scratch為基礎映象的話,意味著你不以任何映象為基礎,接下來所寫的指令將作為映象的第一層。對於linux下靜態編譯的程式來說,並不需要有作業系統提供執行時支援,所需的一切庫都已經在可執行檔案裡了,因此直接from scratch會讓映象體積更加小巧。run指令是用來執行命令列命令的。其格式有兩種:示例:from scratch
shell格式:run 《命令》
run echo '' > /usr/share/nginx/html/index.html
exec格式: run ["可執行檔案", "引數1", "引數2"]
run tar -xzf redis.tar.gz -c /usr/src/redis --strip-components=1
run make -c /usr/src/redis
run make -c /usr/src/redis install
複製檔案指令,格式如下:
copy 《源路徑》 《容器內目標路徑》
## 示例
copy a.txt /usr/text/
## 多個原始檔
copy a.txt b.txt /usr/text/
## 萬用字元形式
copy hom* /mydir/
copy hom?.txt /mydir/
add適合需要自動解壓縮的場合,因此可以遵循這樣的原則,所有的檔案複製均使用copy指令,僅在需要自動解壓縮的場合使用add。
就是用於指定容器主程序預設啟動命令的。格式如下:
shell格式:cmd 《命令》
exec格式: cmd ["引數1","引數2", ...]
引數列**式:cmd ["引數1","引數2", ...]。在指定了entrypoint指定後,用cmd指定具體的引數。
entrypoint的目的和cmd一樣,都是在指定容器啟動程式及引數。entrypoint在執行時也可以替代,不過比cmd要略顯繁瑣,需要通過docker run 的引數 --entrypoint來指定。當指定了entrypoint後,cmd的含義就發生了改變,不再是直接的執行其命令,而是將cmd的內容作為引數傳給entrypoint指令。
該指令用於設定環境變數,格式有兩種:
env
env ==
這個指令很簡單,就是設定環境變數而已,無論是後面的其他指令,如run,還是執行時的應用,都可以直接使用這裡定義的環境變數。
env version=1.0 debug=on name="leisure"
$version # 使用環境變數
下列指令可以支援環境變數:add、copy、env、expose、label、user、workdir、volume、stopsignal、onbuildarg指令用於構建引數,和env的效果一樣,都是設定環境變數。格式如下:
arg 《引數名》[=《預設值》]
和env不同的是,arg所設定的構建環境的環境變數,在將來容器執行時是不會存在這些環境變數的。但是不要因此就使用arg儲存密碼之類的資訊,因為docker history還是可以看到所有值的。
dockerfile中的arg指令是定義引數名稱,以及定義其預設值。該預設值可以在構建命令docker build中用--build-arg 《引數名》=《值》來覆蓋
該指令用於定義匿名卷,格式為:
volume ["《路徑1>","《路徑2>", ...]
volume 《路徑》
volume /data
執行時可以覆蓋這個掛載設定:
docker run -d -v mydata:/data mysql:5.7
在這行命令中,就使用了mydata這個命名卷掛載到了/data這個位置,替代了dockerfile中定義的匿名卷的掛載配置。
該指令用於宣告埠,格式為:
expose 《埠1> [《埠2> ...]
expose指令是宣告執行時容器提供服務埠,這只是乙個宣告,在執行時並不會因為這個宣告應用就會開啟這個埠的服務。
宣告埠的好處:該指令用於指定工作目錄,格式為:1)幫助映象使用者理解這個映象服務的守護埠,以方便配置對映;
2)在執行時使用隨機埠對映時,也就是docker run -p時,會自動隨機對映expose的埠。
workdir 《工作目錄路徑》
使用workdir指令可以來指定工作目錄(或稱為當前目錄),以後各層的當前目錄就被改為指定的目錄,如該目錄不存在,workdir會幫你建立目錄。
初學者可能把dockerfile等同於shell指令碼來書寫,這種錯誤理解還可能會導致初心下面這樣的錯誤:
run echo "hello" > world.txt
該指令用於指定當前使用者,格式為
user 《使用者名稱》
user指令和workdir相似,都是改變環境狀態並影響以後的層。user只是幫你切換到指定使用者,這個使用者必須是事先建立好的,否則無法切換。
onbuild是乙個特殊的指令,它後面跟的是其他指令,比如run,copy等,而這些指令,在當前映象構件時並不會被執行。只有當以當前映象為基礎映象,去構建下一級映象的時候才會被執行。dockerfile中的其他指令都是為了定製當前映象而準備的,唯有onbuild是為了幫助別人定製自己而準備的。
用於指定作者,格式為:
maintainer
maintainer leisure
Dockerfile 常用指令
下面列出了 dockerfile 中最常用的指令,完整列表和說明可參看官方文件。from 指定 base 映象。maintainer 設定映象的作者,可以是任意字串。copy 將檔案從 build context 複製到映象。copy 支援兩種形式 copy src dest copy src de...
Dockerfile常用指令
from from指令是最重要的乙個並且必須為dockerfile檔案開篇的第乙個非注釋行,用於為映象檔案構建過程指定基礎映象,後續的指令執行於此基礎映象提供的執行環境 這個基礎映象可以是任何可用映象,預設情況下docker build會從本地倉庫找指定的映象檔案,如果不存在就會從docker hu...
Dockerfile檔案詳解
一 dockerfile檔案 二 配置檔案詳解 1.from centos 我們的docker是基於哪個基礎映象的 我們的工作目錄 3.copy metadata metadata 將本地的專案拷貝到docker內部 4,run命令 在docker內部執行一下命令,可以是安裝軟體,新建資料夾等操作 ...