Dockerfile檔案常用指令詳解

2022-08-25 18:00:27 字數 3140 閱讀 9882

映象的定製實際上就是定製每一層所新增的配置、檔案。我們可以把每一層修改、安裝、構建、操作的命令都寫入乙個指令碼,這個指令碼就是dockerfile。dockerfile是乙個文字檔案,其內包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

該指令指定基礎映象,然後對映象進行定製。

from ubuntu:16.04
docker還存在乙個特殊的映象,名為scratch,它表示乙個空白映象,如果你一scratch為基礎映象的話,意味著你不以任何映象為基礎,接下來所寫的指令將作為映象的第一層。對於linux下靜態編譯的程式來說,並不需要有作業系統提供執行時支援,所需的一切庫都已經在可執行檔案裡了,因此直接from scratch會讓映象體積更加小巧。

示例:from scratch

run指令是用來執行命令列命令的。其格式有兩種:

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、onbuild

arg指令用於構建引數,和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內部執行一下命令,可以是安裝軟體,新建資料夾等操作 ...