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