指令格式有兩種:註釋和指令
註釋以井號開頭,後面跟上信息
指令以大寫的指令名開頭,後面跟上參數
常見的指令
FROM
兩種形式如下:
FROM <image>通過FROM指定的鏡像名稱必須是一個已經存在的鏡像,這個鏡像稱之為基礎鏡像,必須位於第一條非註釋指令
FROM <image>:/<image>/<image>
MAINTAINER
MAINTAINER <name>指定鏡像的作者信息,包含鏡像的所有者和聯繫人信息
/<name>
RUN
用於指定構建鏡像時運行的命令,兩種模式:
RUN <command> (shell模式)在shell模式下,是使用/bin/sh -c COMMAND來運行命令的在exec模式下可以指定其他的shell來運行命令RUN [“/bin/bash”, “-c”, “echo hello”]
RUN [ "executable", "param1", "param2" ] (exec模式)
/<command>
多條RUN指令可以合併為一條:
RUN yum install httpd && yum install ftp這樣在構建的時候會減少產生中間層鏡像
EXPOSE
指定運行該鏡像的容器使用的端口,可以是多個。
EXPOSE <port>
/<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的默認參數)
/<command>
ENTRYPOINT
與CMD類似,ENTRYPOINT不會被docker run中指定的命令覆蓋,如果想覆蓋ENTRYPOINT,則需要在docker run中指定--entrypoint選項
它有兩種模式:
ENTRYPOINT <command> (shell模式)
ENTRYPOINT [ "executable", "param1", "param2" ] (exec模式)
/<command>
ADD和COPY
作用都是將文件或目錄複製到Dockerfile構建的鏡像中
ADDADD包含了類似tar的解壓功能,如果只是單純複製文件,建議使用COPY,而且,兩者的源文件路徑使用Dockerfile相對路徑,目標路徑使用絕對路徑。<dest>
ADD ["" "<dest>"] (適用於文件路徑包含空格的情況) /<dest>
COPY<dest> /<dest>
ADD ["" "<dest>"] (適用於文件路徑包含空格的情況) /<dest>
/<dest>
COPY index.html /var/www/html
VOLUME
用於向容器添加捲,可以提供共享存儲等功能
VOLUME ['/data']
WORKDIR
在容器內部設置工作目錄,這樣ENTRYPOINT和CMD指定的命令都會在容器中這個目錄下進行。
WORKDIR /path/to/workdir
ENV
用於設置環境變量
ENV<value>
ENV=<value> /<value>
/<value>
USER
用於指定鏡像為什麼用戶去運行
USER nginx鏡像就會以nginx身份運行,可以使用uid,gid等各種組合使用
ONBUILD
為鏡像創建觸發器,當一個鏡像被用作其他鏡像的基礎鏡像時,這個觸發器會被執行。當子鏡像被構建時會插入觸發器中的指令。
ONBUILD COPY index.html /var/www/html
Dockerfile的構建過程
- docker會從Dockerfile文件頭FROM指定的基礎鏡像運行一個容器
- 然後執行一條指令,對容器修改
- 接著執行類似docker commit的操作,創建新的鏡像層
- 在基於剛創建的鏡像運行一個新的容器
- 執行Dockerfile下一條指令,直到所有指令執行完畢
構建緩存
docker在構建過程中會將之前構建的鏡像看做緩存。
當第一次構建的時候,構建過程會比較慢,而在此進行相同的構建的時候,會看見using cache字樣,表示使用了緩存,構建過程也非常快。
如果不想使用構建緩存,則在docker build中使用—no-cache選項。
還可以在Dockerfile中使用ENV REFRESH_DATE 2018-01-01來制定緩存刷新時間,更改這個時間,就會讓後面的命令不使用緩存。
原文鏈接:https://blog.csdn.net/sinat_35930259/article/details/79679294閱讀更多 Live400 的文章