1. 程式人生 > >DockerFile關鍵字介紹

DockerFile關鍵字介紹

Dockerfile使用

建立映象的時候,要在Dockerfile所在的目錄使用docker build命令

sudo docker build --tag example
sudo docker build --tag <使用者名稱>/example

--tag或-t選項用於設計映象名稱,弱項將映象上傳到Docker Hub,只需要在/之前新增使用者名稱即可。

Dockerfile的書寫規則及指令使用方法

Dockerfile的指令是忽略大小寫的,建議使用大寫,使用 # 作為註釋。每一行只支援一條指令,每條指令可以攜帶多個引數。
Dockerfile的指令根據作用可以分為兩種,構建指令和設定指令。

  1. 構建指令用於構建image,其指定的操作不會在執行image的容器上執行。
  2. 設定指令用於設定image的屬性,其指定的操作將在執行image的容器中執行。

Dockerfile關鍵字

FROM(指定基礎映象)

構建指令,Docker中必須使用FROM命令,必須指定且需要在Dockerfile其他指令的前面。後續的指令都依賴於該指令指定的image。FROM指令指定的基礎image可以是官方遠端倉庫中的,也可以位於本地倉庫。
該指令有兩種格式:

  1. FROM <映象>  指定基礎映象為該映象的最後修改的版本。
    FROM ubuntu
  2. FROM <映象>:<標籤>  指定基礎映象為該映象的一個標籤版本。
    FROM ubuntu:15.10

一個Dockerfile中可以使用多個FROM命令,若設定了兩個FROM命令,則建立兩個映象。若使用--tag選項設定了映象名稱,則會應用於最後一個FROM命令。

MAINTAINER(指定映象建立者資訊)

構建指令,用於將image的製作者相關的資訊寫入到image中,一般輸入名字和電子郵箱即可。當我們對該image執行docker inspect命令時,輸出中有相應的欄位記錄該資訊。
格式:

  1. MAINTAINER <建立者資訊>
    MAINTAINER HUi20,<
    [email protected]
    >

RUN(安裝軟體用)

構建指令,在FROM中設定的映象上執行指令碼或命令,在RUN可以執行任何被基礎image支援的命令。如基礎image選擇了ubuntu,那麼軟體管理部分只能使用ubuntu的命令。
該指令有兩種格式:

  1. RUN <命令>使用shell執行命令
    RUN git clone https://github.com/docker/docker.git
  2. RUN ["<可執行檔案>", "<形式引數1>", "<形式引數2>" ... ] 無shell直接執行
    RUN ["/user/local/bin/hello","--help"]

CMD(設定container啟動時執行的操作)

設定指令,用於容器啟動時指定的操作。該操作可以是執行自定義指令碼,也可以是執行系統命令。

一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD.

該指令有三種格式:

  1. CMD ["<可執行檔案>","<形式引數1>","<形式引數2>""] 無shell直接執行時設定形式引數
  2. CMD <命令> <形式引數1>,<形式引數2>  用shell執行命令
  3. CMD ["<形式引數1>","<形式引數2>"]  當Dockerfile指定了ENTRYPOINT。

ENTRYPOINT指定的是一個可執行的指令碼或者程式的路徑,該指定的指令碼或者程式將會以param1和param2作為引數執行。所以如果CMD指令使用上面的形式,那麼Dockerfile中必須要有配套的ENTRYPOINT。

ENTRYPOINT(設定container啟動時執行的操作)

設定指令,指定容器啟動時執行的命令。

但是一個Dockerfile中只能有一條ENTRYPOINT命令,可以多次設定,但是隻有最後一個有效。

兩種格式:

  1. ENTRYPOINT <命令> 引數1 引數2  用shell執行命令
  2. ENTRYPOINT ["<可執行檔案>", "<形式引數1>", "<形式引數2>"]無shell直接執行

ENTRYPONIT可以在docker run命令中使用 -- entrypoint選項進行設定。若設定了 --entrypoint選項,則忽略Dockerfile檔案中的ENTRYPONIT

EXPOSE(指定容器需要對映到宿主機器的埠)

設定指令,該指令會將容器中的埠對映成宿主機器中的某個埠。
格式:

  1. EXPOSE <埠號>

EXPOSE只用於與主機進行連線,並不對外暴露。若想講埠號暴露在外,需要使用docker run命令的-p、-P選項

ENV(用於設定環境變數)

構建指令,在image中設定一個環境變數。
格式:

  1. ENV <環境變數> <值>  使用環境變數時,要新增$符號

設定了後,後續的RUN命令都可以使用,container啟動後,可以通過docker inspect檢視這個環境變數。

也可以通過在docker run --e  <環境變數>=<值>時設定或修改環境變數。

ADD(向映象新增檔案)

構建指令,所有拷貝到container中的檔案和資料夾許可權為0755,uid和gid為0。

格式:

  1. ADD <要複製檔案的路徑> <檔案在映象中的路徑>  

src要複製檔案的路徑

dest檔案在映象中的路徑

注意:

  1. <src>以上下文目錄為基準,不能使用上下文以外的檔案、目錄或絕對路徑
  2. <src> 可以是Dockerfile所在目錄的一個相對路徑,也可以是一個URL,還可以是一個tar檔案(自動解壓為目錄)
  3. 如果<src>是檔案且<dest>中不使用斜槓結束,則會將<dest>視為檔案,<src>的內容會寫入<dest>
  4. 如果<src>是檔案且<dest>中使用斜槓結束,則會<src>檔案拷貝到<dest>目錄下
  5. <dest> 是容器中的絕對路徑
  6. 如果是一個目錄,那麼會將該目錄下的所有檔案新增到container中,不包括目錄
  7. 如果檔案是可識別的壓縮格式,則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檔案在映象中的路徑

注意

  1. <src>以上下文目錄為基準,不能使用上下文以外的檔案、目錄或絕對路徑
  2. <src>不僅可以設定為檔案,還可以設定為目錄。設定為目錄時,會複製目錄下的所有檔案。另外,也可以使用萬用字元只複製特定檔案
  3. <src>不可以設定為網路檔案的URL
  4. 壓縮檔案不會解壓縮,直接複製
  5. <dest>必須設定為絕對路徑。並且,若路徑以/結尾,則建立目錄並將檔案複製到該目錄
  6. 添加當前目錄時,.dockerignore檔案中設定的檔案與目錄會被排除在外

VOLUME(指定掛載點))

設定指令,使容器中的一個目錄具有持久化儲存資料的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。,當容器關閉後,所有的更改都會丟失。當容器中的應用有持久化資料的需求時可以在Dockerfile中使用該指令。可以將本地資料夾或者其他container的資料夾掛載到container中。
格式:

  1. VOLUME ["<容器目錄1>","<容器目錄2>"]  
  2. VOLUME <容器目錄>

使用VOLUME不能與主機的特定目錄進行連線

若想連線資料卷與主機的特定目錄,則必須在docker run 命令中使用-v選項。

選項格式為:-v <主機目錄>:<容器目錄>

USER(設定container容器的使用者)

設定指令,設定啟動容器的使用者,預設是root使用者。該使用者會應用於RUN、CMD、ENTRYPOINT

格式:

  1. 使用格式為USER<賬號使用者名稱>

USER後面的所有RUN、CMD、ENTRYPOINT都會得到應用,中間可以設定其他使用者以更換使用者

WORKDIR(切換目錄)

切換目錄用,設定指令,可以多次切換(相當於cd命令),對RUN,CMD,ENTRYPOINT生效。
格式:

  1. WORKDIR <路徑>

設定WORKDIR時也可以用相對路徑替代絕對路徑。若使用相對路徑,先要以設定的WORKDIR路徑為基準更改目錄。最初基準為/

ONBUILD(在子映象中執行)

ONBUILD 指定的命令在構建映象時並不執行,而是在它的子映象中執行

格式:

  1. ONBUILD <Dockerfile命令><Dockerfile命令的形式引數> 

需要再次建立example映象後,使用docker run命令才會執行ONBUILD設定的指令