您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Dockerfile指令與基本結構實例代碼分析”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Dockerfile指令與基本結構實例代碼分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
基本結構
dockerfile 由一行行命令語句組成,并且支持以 # 開頭的注釋行。 一般的,dockerfile 分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令。
例如:
// 基礎鏡像信息 from daocloud.io/node:7 // 維護者信息 maintainer abel.yang <527515025@qq.com> label descripttion="this image is build for web" //鏡像操作指令 run mkdir -p /opt/apps/epp copy . /opt/apps/epp workdir /opt/apps/epp/epp-web/server env lang c.utf-8 env tz=asia/shanghai run ln -snf /usr/share/zoneinfo/asia/shanghai /etc/localtime && echo asia/shanghai > /etc/timezone expose 3001 //容器啟動時執行指令 cmd [ "npm", "start" ]
其中,一開始必須指明所基于的鏡像名稱,接下來推薦說明維護者信息。 后面則是鏡像操作指令,例如 run 指令, run 指令將對鏡像執行跟隨的命令。
每運行一條 run 指令,鏡像添加新的一層,并提交。 最后是 cmd 指令,來指定運行容器時的操作命令。
指令
instruction arguments,指令包括 from、maintainer、run 等
格式為 from <image>或from <image>:<tag>。
第一條指令必須為 from 指令。并且,如果在同一個dockerfile中創建多個鏡像時,可以使用多個 from 指令(每個鏡像一次)。
maintainer
格式為 maintainer ,指定維護者信息。
run
格式為 run 或 run [“executable”, “param1”, “param2”]。
前者將在 shell 終端中運行命令,即 /bin/sh -c;后者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 run [“/bin/bash”, “-c”, “echo hello”]。
每條 run 指令將在當前鏡像基礎上執行指定命令,并提交為新的鏡像。當命令較長時可以使用 \ 來換行。
cmd
支持三種格式
cmd ["executable","param1","param2"] 使用 exec 執行,推薦方式;
cmd command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
cmd ["param1","param2"] 提供給 entrypoint 的默認參數;
指定啟動容器時執行的命令,每個 dockerfile 只能有一條 cmd 命令。如果指定了多條命令,只有最后一條會被執行。
如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 cmd 指定的命令。
expose
格式為 expose <port> [<port>...]。
告訴 docker 服務端容器暴露的端口號,供互聯系統使用。在啟動容器時需要通過 -p,docker 主機會自動分配一個端口轉發到指定的端口。
env
格式為 env <key> <value>。 指定一個環境變量,會被后續 run 指令使用,并在容器運行時保持。
add
格式為 add <src> <dest>。
該命令將復制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是dockerfile所在目錄的一個相對路徑;也可以是一個 url;還可以是一個 tar 文件(自動解壓為目錄)。
copy
格式為 copy <src> <dest>。
復制本地主機的 <src>(為 dockerfile 所在目錄的相對路徑)到容器中的 <dest>。
當使用本地目錄為源目錄時,推薦使用 copy。
entrypoint
兩種格式:
entrypoint ["executable", "param1", "param2"]
entrypoint command param1 param2(shell中執行)。
配置容器啟動后執行的命令,并且不可被 docker run 提供的參數覆蓋。
每個 dockerfile 中只能有一個 entrypoint,當指定多個時,只有最后一個起效。
volume
格式為 volume [“/data”]。
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。
user
格式為 user daemon。
指定運行容器時的用戶名或 uid,后續的 run 也會使用指定用戶。
當服務不需要管理員權限時,可以通過該命令指定運行用戶。并且可以在之前創建所需要的用戶
例如:run groupadd -r postgres && useradd -r -g postgres postgres
。要臨時獲取管理員權限可以使用 gosu
,而不推薦 sudo
。
workdir
格式為 workdir /path/to/workdir。
為后續的 run、cmd、entrypoint 指令配置工作目錄。
可以使用多個 workdir 指令,后續命令如果參數是相對路徑,則會基于之前命令指定的路徑。例如
workdir /a workdir b workdir c run pwd 則最終路徑為 /a/b/c。
onbuild
格式為 onbuild [instruction]。
配置當所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。
例如,dockerfile 使用如下的內容創建了鏡像 image-a。
[...] onbuild add . /app/src onbuild run /usr/local/bin/python-build --dir /app/src [...]
如果基于 image-a 創建新的鏡像時,新的dockerfile中使用 from image-a指定基礎鏡像時,會自動執行 onbuild 指令內容,等價于在后面添加了兩條指令。
from image-a
#automatically run the following add . /app/src run /usr/local/bin/python-build --dir /app/src
使用 onbuild 指令的鏡像,推薦在標簽中注明,例如 ruby:1.9-onbuild
。
創建鏡像
編寫完成 dockerfile 之后,可以通過 docker build 命令來創建鏡像。
docker build -t 鏡像名字 . // 注意 . 不能忘。
下面兩個dockerhub上的dockerfile的例子。
# nginx # # version 0.0.1 from ubuntu maintainer victor vieux <victor@docker.com> run apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server # 在ubuntu的父鏡像基礎上安裝inotify-tools,nginx,apache2,openssh-server,從而創建一個新的nginx鏡像。
# firefox over vnc # #version 0.3 from ubuntu # install vnc,xvfb in order to create a 'fake' display and firefox run apt-get update && apt-get install -y x11vnc firefox run mkdir /.vnc # setup a pssword run x11vnc -storepasswd 1234 ~/.vnc/passwd #autostart firefox run bash -c 'echo "firefox" >> /.bashrc' expose 5900 cmd ["x11vnc", "-forever", "-usepw", "-create"] # 基于ubuntu父鏡像,安裝firefox和vnc軟件,啟動后,用戶可以通過5900端口通過vnc方式使用firefox。
讀到這里,這篇“Dockerfile指令與基本結構實例代碼分析”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。