docker(8)Dockerfile指令介紹

2022-01-10 04:31:37 字數 3825 閱讀 2031

dockerfile 是乙個用來構建映象的文字檔案,文字內容包含了一條條構建映象所需的指令和說明。

dockerfile是用來構建docker映象的構建檔案,是由一系列命令和引數構成的指令碼。

簡單來說,dockerfile就是把我們安裝環境的每個步驟和指令,放到乙個檔案,最後一鍵執行,最後做成乙個你想要的環境。

docker構建三步曲:

只支援docker自己定義的一套指令,不支援自定義

大小寫不敏感,但是建議全部使用大寫

根據dockerfile的內容順序執行

from

必須放在dockerfile的第一行,表示從哪個baseimage開始構建

可選的,映象維護者的姓名和郵箱位址

每乙個run指令都會是在乙個新的container裡面執行,並提交為乙個image作為下乙個run的base

乙個dockerfile中可以包含多個run,按定義順序執行

run支援兩種執行方式:

run 《命令列命令》

# 《命令列命令》 等同於,在終端操作的 shell 命令。

run ["可執行檔案", "引數1", "引數2"]

# 例如:

# run ["./test.php", "dev", "offline"] 等價於 run ./test.php dev offline

dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成映象膨脹過大。例如:

from centos

run yum install wget

run wget -o redis.tar.gz ""

run tar -xvf redis.tar.gz

以上執行會建立 3 層映象。可簡化為以下格式:

from centos

run yum install wget \

&& wget -o redis.tar.gz "" \

&& tar -xvf redis.tar.gz

如上,以 && 符號連線命令,這樣執行後,只會建立 1 層映象。

cmd的作用是作為執行container時候的預設行為(容器預設的啟動命令)

當執行container的時候宣告了command,則不再用image中的cmd預設所定義的命令

乙個dockerfile中只能有乙個有效的cmd,當定義多個cmd的時候,只有最後乙個才會起作用

cmd定義的三種方式:

cmd ","",...] 

cmd ["","",...] # 這個時候cmd作為entrypoint的引數

僅僅只是宣告埠。

幫助映象使用者理解這個映象服務的守護埠,以方便配置對映。

在執行時使用隨機埠對映時,也就是 docker run -p 時,會自動隨機對映 expose 的埠。

expose 《埠1> [《埠2>...]
類似於 cmd 指令,但其不會被 docker run 的命令列引數指定的指令所覆蓋,而且這些命令列引數會被當作引數送給entrypoint指令指定的程式。

但是, 如果執行 docker run 時使用了 --entrypoint 選項,此選項的引數可當作要執行的程式覆蓋 entrypoint 指令指定的程式。

優點:在執行 docker run 的時候可以指定 entrypoint 執行所需的引數。

注意:如果 dockerfile 中如果存在多個 entrypoint 指令,僅最後乙個生效。

格式:

entrypoint ["","","",...]
可以搭配 cmd 命令使用:一般是變參才會使用 cmd ,這裡的 cmd 等於是在給 entrypoint 傳參,以下示例會提到。

示例:假設已通過 dockerfile 構建了 nginx:test 映象:

from nginx

entrypoint ["nginx", "-c"] # 定參

cmd ["/etc/nginx/nginx.conf"] # 變參

1、不傳參執行

$ docker run  nginx:test
容器內會預設執行以下命令,啟動主程序。

nginx -c /etc/nginx/nginx.conf

2、傳參執行

$ docker run  nginx:test -c /etc/nginx/new.conf
容器內會預設執行以下命令,啟動主程序(/etc/nginx/new.conf:假設容器內已有此檔案)

nginx -c /etc/nginx/new.conf
複製指令,從上下文目錄中複製檔案或者目錄到容器裡指定路徑。

格式:

copy [--chown=:] 《源路徑1>...  《目標路徑》

copy [--chown=:] ["《源路徑1>",... "《目標路徑》"]

[--chown=:]:

可選引數,使用者改變複製到容器內檔案的擁有者和屬組。

《源路徑》:原始檔或者源目錄,這裡可以是萬用字元表示式,其萬用字元規則要滿足 go 的 filepath.match 規則。例如:

copy hom* /mydir/

copy hom?.txt /mydir/

《目標路徑》:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動建立。

設定環境變數,定義了環境變數,那麼在後續的指令中,就可以使用這個環境變數。

格式:

env env ==...
以下示例設定 node_version = 7.2.0 , 在後續的指令中可以通過 $node_version 引用:

env node_version 7.2.0

run curl -slo "" \

&& curl -slo ""

用來指定當前工作目錄(或者稱為當前目錄,容器啟動時執行的命令會在該目錄下執行

用 workdir 指定的工作目錄,會在構建映象的每一層中都存在。(workdir 指定的工作目錄,必須是提前建立好的)。

docker build 構建映象過程中的,每乙個 run 命令都是新建的一層。只有通過 workdir 建立的目錄才會一直存在。

格式:

workdir 《工作目錄路徑》
用於指定執行後續命令的使用者和使用者組,這邊只是切換後續命令執行的使用者(使用者和使用者組必須提前已經存在)。

格式:

user 《使用者名稱》[:《使用者組》]
用於延遲構建命令的執行。簡單的說,就是 dockerfile 裡用 onbuild 指定的命令,在本次構建映象的過程中不會執行(假設映象為 test-build)。當有新的 dockerfile 使用了之前構建的映象 from test-build ,這是執行新映象的 dockerfile 構建時候,會執行 test-build 的 dockerfile 裡的 onbuild 指定的命令。

格式:

onbuild 《其它指令》
定義匿名資料卷。在啟動容器時忘記掛載資料卷,會自動掛載到匿名卷。

作用:

volume ["《路徑1>", "《路徑2>"...]

volume 《路徑》

docker映象的製作(一) dockerfile

映象的儲存方式,利用linux的聯合儲存檔案系統,不同的目錄可以掛載在同乙個的檔案系統下,就能形成分層的結構 在同乙個目錄下查詢到其他各個目錄的檔案。在 docker commit 的學習中,我們可以了解到,映象的定製實際上就是定製每一層所 新增的配置 檔案。如果我們可以把每一層修改 安裝 構建 操...

docker學習 8 docker資料卷

我們首先來回顧一下docker的理念,就是將應用和環境打包成乙個映象,那資料呢就存在於容器中,如果容器被刪,那資料就會丟失,因此我們有乙個希望資料可以長久儲存的需求,就算容器被刪,也能找回資料,盡力減少刪庫跑路帶來的損失。實際上容器之間有一種資料共享的技術,使得docker容器產生的資料,直接同步到...

docker安裝mysql8問題

docker中安裝mysql8,出現如下問題 client does not support authentication protocol 解決辦法 1.首先進入mysql容器的bash終端 docker exec it mysql bash2.登陸mysql mysql u root p 接著輸...