DockerFile關鍵字介紹
Dockerfile使用
建立映象的時候,要在Dockerfile所在的目錄使用docker build命令
sudo docker build --tag example
sudo docker build --tag <使用者名稱>/example
--tag或-t選項用於設計映象名稱,弱項將映象上傳到Docker Hub,只需要在/之前新增使用者名稱即可。
Dockerfile的書寫規則及指令使用方法
Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為註釋。每一行只支援一條指令,每條指令可以攜帶多個引數。
Dockerfile的指令根據作用可以分為兩種,構建指令和設定指令。
- 構建指令用於構建image,其指定的操作不會在執行image的容器上執行。
- 設定指令用於設定image的屬性,其指定的操作將在執行image的容器中執行。
Dockerfile關鍵字
FROM(指定基礎映象)
構建指令,Docker中必須使用FROM命令,必須指定且需要在Dockerfile其他指令的前面。後續的指令都依賴於該指令指定的image。FROM指令指定的基礎image可以是官方遠端倉庫中的,也可以位於本地倉庫。
該指令有兩種格式:
- FROM <映象> 指定基礎映象為該映象的最後修改的版本。
FROM ubuntu
- FROM <映象>:<標籤> 指定基礎映象為該映象的一個標籤版本。
FROM ubuntu:15.10
一個Dockerfile中可以使用多個FROM命令,若設定了兩個FROM命令,則建立兩個映象。若使用--tag選項設定了映象名稱,則會應用於最後一個FROM命令。
MAINTAINER(指定映象建立者資訊)
構建指令,用於將image的製作者相關的資訊寫入到image中,一般輸入名字和電子郵箱即可。當我們對該image執行docker inspect命令時,輸出中有相應的欄位記錄該資訊。
格式:
- MAINTAINER <建立者資訊>
MAINTAINER HUi20,<
RUN(安裝軟體用)
構建指令,在FROM中設定的映象上執行指令碼或命令,在RUN可以執行任何被基礎image支援的命令。如基礎image選擇了ubuntu,那麼軟體管理部分只能使用ubuntu的命令。
該指令有兩種格式:
- RUN <命令>使用shell執行命令
RUN git clone https://github.com/docker/docker.git
- RUN ["<可執行檔案>", "<形式引數1>", "<形式引數2>" ... ] 無shell直接執行
RUN ["/user/local/bin/hello","--help"]
CMD(設定container啟動時執行的操作)
設定指令,用於容器啟動時指定的操作。該操作可以是執行自定義指令碼,也可以是執行系統命令。
一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD.
該指令有三種格式:
- CMD ["<可執行檔案>","<形式引數1>","<形式引數2>""] 無shell直接執行時設定形式引數
- CMD <命令> <形式引數1>,<形式引數2> 用shell執行命令
- CMD ["<形式引數1>","<形式引數2>"] 當Dockerfile指定了ENTRYPOINT。
ENTRYPOINT指定的是一個可執行的指令碼或者程式的路徑,該指定的指令碼或者程式將會以param1和param2作為引數執行。所以如果CMD指令使用上面的形式,那麼Dockerfile中必須要有配套的ENTRYPOINT。
ENTRYPOINT(設定container啟動時執行的操作)
設定指令,指定容器啟動時執行的命令。
但是一個Dockerfile中只能有一條ENTRYPOINT命令,可以多次設定,但是隻有最後一個有效。
- ENTRYPOINT <命令> 引數1 引數2 用shell執行命令
- ENTRYPOINT ["<可執行檔案>", "<形式引數1>", "<形式引數2>"]無shell直接執行
ENTRYPONIT可以在docker run命令中使用 -- entrypoint選項進行設定。若設定了 --entrypoint選項,則忽略Dockerfile檔案中的ENTRYPONIT
EXPOSE(指定容器需要對映到宿主機器的埠)
設定指令,該指令會將容器中的埠對映成宿主機器中的某個埠。
格式:
- EXPOSE <埠號>
EXPOSE只用於與主機進行連線,並不對外暴露。若想講埠號暴露在外,需要使用docker run命令的-p、-P選項
ENV(用於設定環境變數)
構建指令,在image中設定一個環境變數。
格式:
- ENV <環境變數> <值> 使用環境變數時,要新增$符號
設定了後,後續的RUN命令都可以使用,container啟動後,可以通過docker inspect檢視這個環境變數。
也可以通過在docker run --e <環境變數>=<值>時設定或修改環境變數。
ADD(向映象新增檔案)
構建指令,所有拷貝到container中的檔案和資料夾許可權為0755,uid和gid為0。
格式:
- ADD <要複製檔案的路徑> <檔案在映象中的路徑>
src要複製檔案的路徑
dest檔案在映象中的路徑
注意:
- <src>以上下文目錄為基準,不能使用上下文以外的檔案、目錄或絕對路徑
- <src> 可以是Dockerfile所在目錄的一個相對路徑,也可以是一個URL,還可以是一個tar檔案(自動解壓為目錄)
- 如果<src>是檔案且<dest>中不使用斜槓結束,則會將<dest>視為檔案,<src>的內容會寫入<dest>
- 如果<src>是檔案且<dest>中使用斜槓結束,則會<src>檔案拷貝到<dest>目錄下
- <dest> 是容器中的絕對路徑
- 如果是一個目錄,那麼會將該目錄下的所有檔案新增到container中,不包括目錄
- 如果檔案是可識別的壓縮格式,則docker會幫忙解壓縮(注意壓縮格式)
ADD只有在build映象的時候執行一次,後面執行container的時候不會再重新載入了。
COPY(向映象新增檔案)
複製本地主機的 <src> (為Dockerfile所在目錄的相對路徑)到容器中的 <dest>
使用COPY新增檔案時,不會解壓縮,也不能使用檔案URL
從上面的定義中可獲知,src可以是Dockerfile所在目錄的一個相對路徑,但在實際操作中,只有與Dockerfile檔案在同一目錄的檔案或目錄可以成功的使用ADD <src> <dest>
如果檔案或目錄不與Dockerfile在同一目錄會提示 no such file or directory,如:(ADD ../test2 /data/code/nginx),從Dockerfile所在目錄通過 cd ../test2可以到達test2
格式:
COPY <要複製檔案的路徑> <檔案在映象中的路徑>
src要複製檔案的路徑
dest檔案在映象中的路徑
注意
- <src>以上下文目錄為基準,不能使用上下文以外的檔案、目錄或絕對路徑
- <src>不僅可以設定為檔案,還可以設定為目錄。設定為目錄時,會複製目錄下的所有檔案。另外,也可以使用萬用字元只複製特定檔案
- <src>不可以設定為網路檔案的URL
- 壓縮檔案不會解壓縮,直接複製
- <dest>必須設定為絕對路徑。並且,若路徑以/結尾,則建立目錄並將檔案複製到該目錄
- 添加當前目錄時,.dockerignore檔案中設定的檔案與目錄會被排除在外
VOLUME(指定掛載點))
設定指令,使容器中的一個目錄具有持久化儲存資料的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。,當容器關閉後,所有的更改都會丟失。當容器中的應用有持久化資料的需求時可以在Dockerfile中使用該指令。可以將本地資料夾或者其他container的資料夾掛載到container中。
格式:
- VOLUME ["<容器目錄1>","<容器目錄2>"]
- VOLUME <容器目錄>
使用VOLUME不能與主機的特定目錄進行連線
若想連線資料卷與主機的特定目錄,則必須在docker run 命令中使用-v選項。
選項格式為:-v <主機目錄>:<容器目錄>
USER(設定container容器的使用者)
設定指令,設定啟動容器的使用者,預設是root使用者。該使用者會應用於RUN、CMD、ENTRYPOINT
格式:
- 使用格式為USER<賬號使用者名稱>
USER後面的所有RUN、CMD、ENTRYPOINT都會得到應用,中間可以設定其他使用者以更換使用者
WORKDIR(切換目錄)
切換目錄用,設定指令,可以多次切換(相當於cd命令),對RUN,CMD,ENTRYPOINT生效。
格式:
- WORKDIR <路徑>
設定WORKDIR時也可以用相對路徑替代絕對路徑。若使用相對路徑,先要以設定的WORKDIR路徑為基準更改目錄。最初基準為/
ONBUILD(在子映象中執行)
ONBUILD 指定的命令在構建映象時並不執行,而是在它的子映象中執行
格式:
- ONBUILD <Dockerfile命令><Dockerfile命令的形式引數>
需要再次建立example映象後,使用docker run命令才會執行ONBUILD設定的指令