Dockerfile書寫規則
簡介
Dockerfile類似於Makefile,包含有多條構建指令,Docker可以通過Dockerfile自動生成自定義鏡像。
用法
docker build
命令根據Dockerfile上下文構建鏡像。構建的上下文是指定位置PATH或URL的文件集合。PATH是本地文件系統的一個文件夾。URL是一個Git倉庫地址。
構建由Docker守護進程運行,而不是由CLI運行。構建過程所做的第一件事是將整個上下文遞歸地發送到守護進程。在大多數情況下,最好以空目錄作為上下文,並將Dockerfile保存在該目錄中,僅添加構建鏡像所需的文件。
不要使用根目錄,/
作為構建的上下文PATH,這樣會導致將磁盤上所有的內容發送到守護進程。
在Dockerfile中通過指令指定上下文中的文件。如果要提高構建性能,可以通過.dockerignore排除上下文中的某些文件或目錄。
格式
# Comment
INSTRUCTION arguments
指令不區分大小寫,但是慣例使用大寫,以便將它們和參數區分開來。
Docker按順序執行Dockerfile中的指令。一個Dockerfile必須用FROM指令啟動。
Docker使用#作為註釋的開頭。
Dockerfile指令
FROM
指定基礎鏡像,通常我們會基於某個基礎鏡像定制自己的鏡像,在DockerStore上有很多的官方鏡像,我們可以基於這些鏡像來定制自己的鏡像。如果沒有找到對應的鏡像,官方鏡像中還提供了一些更為基礎的操作系統鏡像;除此之外,還存在一個名為scratch的特殊鏡像,這個鏡像並不實際存在,是一個空白的鏡像。
FROM <image> [AS <name>]
or
FROM <image>[:<tag>] [AS <name>]
or
FROM <image>[@<digest>] [AS <name>]
RUN
執行命令行命令。
RUN有兩種形式:
RUN <command>
(shell格式,該命令在shell中運行,默認情況下/bin/sh -c在Linux或cmd /S /C Windows上運行)RUN ["executable", "param1", "param2"]
(exec格式)
CMD
指定容器主進程的啟動命令。在運行時可以指定新的命令來代替這個默認命令。
CMD指令有三種格式:
CMD ["executable","param1","param2"]
(exec格式,一般推薦使用的格式)CMD ["param1","param2"]
(參數列表格式)CMD command param1 param2
(shell格式)
LABEL
LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL指令添加元數據到鏡像中。如果要使用包含有空格的元數據,可以給key-value加上引號。
MAINTAINER
MAINTAINER <name>
這個指令設置鏡像的維護者。而LABEL更加靈活,可以設置任何需要的元數據,並且可以輕松查看。要設置MAINTAINER信息可以使用LABEL進行設置:
LABEL maintainer="[email protected]"
EXPOSE
EXPOSE <port> [<port>/<protocol>...]
EXPOSE指令告訴Docker容器在運行時監聽指定的網絡端口。如果未指定協議,則默認為TCP。
EXPOSE指令僅僅是聲明運行時容器打算使用什麽端口,並不會自動在宿主進行端口映射。
ENV
ENV <key> <value>
ENV <key>=<value> ...
ENV指令將環境變量<key>
設置為值<value>
。這個值將在構建階段中的所有後續指令環境中。
COPY
復制文件。
COPY有兩種格式:
COPY <src>... <dest>
COPY ["<src>", ... "<dest>"]
ADD
更高級的復制文件
ADD指令和COPY基本一致,但是在COPY的基礎上增強了一些功能。比如源文件可以是一個URL,在這種情況下,Docker會試圖去下載這個鏈接的文件放到目標路徑中,下載後的文件權限自動設置為600,如果這個權限不是想要的權限,那麽還需要增加額外的RUN進行權限調整,況且,如果下載的是壓縮包,還需要解壓縮。所以不如直接調用RUN指令,然後使用wget或者curl工具下載,這個功能並不推薦使用。
如果源文件是一個tar壓縮包的話,壓縮格式為gzip,bzip2以及xz的情況下,ADD指令將會自動解壓縮這個壓縮文件到目標路徑中,在某些情況下這個自動解壓縮的功能非常有用。
ENTRYPOINT
入口點
ENTRYPOINT的格式和RUN指令格式一樣,分為exec格式和shell格式。
ENTRYPOINT的目的和CMD一樣,都是指定了容器啟動的參數。ENTRYPOINT在運行時也可以被替代,需要通過docker run
的參數-entrypoint
來指定。
如果指定了ENTRYPOINT指令,CMD就不再是直接運行了,而是將CMD的內容作為參數傳遞給ENTRYPOINT指令。
ARG
構建參數
ARG <name>[=<defaul value>]
構建參數和ENV的效果一樣,都是設置環境變量。不同的是,ARG所設置的構建環境的環境變量在將來容器運行時是不會存在的。
VOLUME
定義匿名卷
VOLUME ["/data"]
WORKDIR
指定工作目錄。
使用WORKDIR指令可以指定工作目錄。
USER
指定當前用戶。
Dockerfile書寫規則