4.6docker基礎詳細版--Dockerfile詳解

Dockerfile的指令格式


指令格式有兩種:註釋和指令

註釋以井號開頭,後面跟上信息

指令以大寫的指令名開頭,後面跟上參數

常見的指令

FROM

兩種形式如下:

 FROM <IMAGE>
 FROM <IMAGE>:<TAG>

通過FROM指定的鏡像名稱必須是一個已經存在的鏡像,這個鏡像稱之爲基礎鏡像,必須位於第一條非註釋指令

MAINTAINER

MAINTAINER <NAME>

指定鏡像的作者信息,包含鏡像的所有者和聯繫人信息

RUN

用於指定構建鏡像時運行的命令,兩種模式:

RUN <command> (shell模式)
RUN [ "executable", "param1", "param2" ] (exec模式)

在shell模式下,是使用/bin/sh -c COMMAND來運行命令的
在exec模式下可以指定其他的shell來運行命令RUN ["/bin/bash", "-c", "echo hello"]

多條RUN指令可以合併爲一條:

RUN yum install httpd && yum install ftp

這樣在構建的時候會減少產生中間層鏡像

EXPOSE

指定運行該鏡像的容器使用的端口,可以是多個。

EXPOSE <PORT>

使用這個指令的目的是告訴應用程序容器內應用程序會使用的端口,在運行時還需要使用-p參數指定映射端口。這是docker處於安全的目的,不會自動打開端口。

docker run -p 80 -d dockertest/dockerfile_build nginx -g "daemon off"

CMD

用於提供容器運行的默認命令,如果在docker run時指定了運行的命令,則CMD命令不會執行。
CMD有三種模式:

CMD <command> (shell模式)
CMD [ "executable", "param1", "param2" ] (exec模式)
CMD [ 'param1', 'param2'] (通常與ENTRYPOINT搭配指定ENTRYPOINT的默認參數)

ENTRYPOINT

與CMD類似,ENTRYPOINT不會被docker run中指定的命令覆蓋,如果想覆蓋ENTRYPOINT,則需要在docker run中指定--entrypoint選項

它由兩種模式:

ENTRYPOINT <command> (shell模式)
ENTRYPOINT [ "executable", "param1", "param2" ] (exec模式)

ADD和COPY

作用都是將文件或目錄複製到Dockerfile構建的鏡像中

ADD <src> <dest>
ADD ["<src>" "<dest>"] (適用於文件路徑包含空格的情況)

COPY <src> <dest>
ADD ["<src>" "<dest>"] (適用於文件路徑包含空格的情況)

ADD包含了類似tar的解壓功能,如果只是單純複製文件,建議使用COPY,而且,兩者的源文件路徑使用Dockerfile相對路徑,目標路徑使用絕對路徑。

COPY index.html /var/www/html

VOLUME

用於向容器添加捲,可以提供共享存儲等功能

VOLUME ['/data']

WORKDIR

在容器內部設置工作目錄,這樣ENTRYPOINT和CMD指定的命令都會在容器中這個目錄下進行。

WORKDIR /path/to/workdir

ENV

用於設置環境變量

ENV <KEY> <VALUE>
ENV <KEY>=<VALUE>

USER

用於指定鏡像爲什麼用戶去運行

USER nginx

鏡像就會以nginx身份運行,可以使用uid,gid等各種組合使用

ONBUILD

爲鏡像創建觸發器,當一個鏡像被用作其他鏡像的基礎鏡像時,這個觸發器會被執行。當子鏡像被構建時會插入觸發器中的指令。

ONBUILD COPY index.html /var/www/html

Dockerfile的構建過程


  1. docker會從Dockerfile文件頭FROM指定的基礎鏡像運行一個容器
  2. 然後執行一條指令,對容器修改
  3. 接着執行類似docker commit的操作,創建新的鏡像層
  4. 在基於剛創建的鏡像運行一個新的容器
  5. 執行Dockerfile下一條指令,直到所有指令執行完畢

docker會刪除中間層創建的容器,但不會刪除中間層鏡像,所以可以使用docker run運行一箇中間層容器,從而查看每一步構建後的鏡像狀態,這樣就可以進行調試。

構建緩存

docker在構建過程中會將之前構建的鏡像看做緩存。

當第一次構建的時候,構建過程會比較慢,而在此進行相同的構建的時候,會看見using cache字樣,表示使用了緩存,構建過程也非常快。

如果不想使用構建緩存,則在docker build中使用--no-cache選項。

還可以在Dockerfile中使用ENV REFRESH_DATE 2018-01-01來制定緩存刷新時間,更改這個時間,就會讓後面的命令不使用緩存。

查看鏡像的構建過程

docker history [image]

本文轉自:這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章