1、FROM指定基礎鏡像。FROM指令是Dockfile文件中的收條命令,啟動構建流程后,Docker將會給予該鏡像構建新鏡像。
FROM <image> 或者 FROM <image>:<tag>
或者
FROM <image>:<digest>
2、RUN執行命令。在鏡像的構建過程中執行特定的命令,並生成一個中間鏡像。
RUN <command> 或者 RUN ["executable", "param1", "param2"]
3、COPY復制文件
COPY <源路徑>...<目標路徑> COPY ["<源路徑1>",..."目標路徑"]
<目標路徑>可以是容器的絕對路徑,也可以是相對工作目錄的相對路徑。目標路徑不需要實現創建,如果目標目錄不存在會在復制文件前先行創建卻是穆勒。
4、ADD添加文件
ADD <源路徑>...<目標路徑> ADD ["<源路徑1>",..."目標路徑"]
<源路徑>可以是URL,Docker引擎會試圖去下載這個鏈接的文件到目標路徑去。
5、ENV設置環境變了
ENV <key> <value> ENV <key1>=<value1> <key2>=<value2>...
后面的其他指令,以及運行時的應用都可以使用。
6、EXPOSE為構建的鏡像設置監聽端口,使容器在運行時監聽。
EXPOSE <port> [<port>...]
EXPOSE指令並不會讓容器監聽host的端口。
7、VOLUME用於創建掛載點,即向基於所構建鏡像創始的容器添加卷。
VOLUME ["/data"]
一個卷可以存在於一個或多個容器的指定目錄,該目錄可以繞過聯合文件系統,並具有以下功能:
- 卷可以容器間共享和重用
- 容器並不一定要和其它容器共享卷
- 修改卷后會立即生效
- 對卷的修改不會對鏡像產生影響
- 卷會一直存在,直到沒有任何容器在使用它
VOLUME 讓我們可以將源代碼、數據或其它內容添加到鏡像中,而又不並提交到鏡像中,並使我們可以多個容器間共享這些內容。
8、WORKDIR指定工作目錄。
WORKDIR /path/to/workdir
通過WORKDIR設置工作目錄后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都會在該目錄下執行
9、USER指定當前用戶
USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group
使用USER指定用戶時,可以使用用戶名、UID 或 GID,或是兩者的組合
使用USER指定用戶后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT 都將使用該用戶。鏡像構建完成后,通過 docker run 運行容器時,可以通過 -u
參數來覆蓋所指定的用戶。
10、CMD用於指定容器啟動時所要執行的命令。
CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2
CMD 在容器運行的時候執行,在構建時不進行任何操作。
11、ENTRYPOINT
ENTRYPOINT 用於給容器配置一個可執行程序。也就是說,每次使用鏡像創建容器時,通過 ENTRYPOINT 指定的程序都會被設置為默認程序。ENTRYPOINT 有以下兩種形式:
ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2
ENTRYPOINT 與 CMD 非常類似,不同的是通過docker run
執行的命令不會覆蓋 ENTRYPOINT,而docker run
命令中指定的任何參數,都會被當做參數再次傳遞給 ENTRYPOINT。Dockerfile 中只允許有一個 ENTRYPOINT 命令,多指定時會覆蓋前面的設置,而只執行最后的 ENTRYPOINT 指令。
docker run
運行容器時指定的參數都會被傳遞給 ENTRYPOINT ,且會覆蓋 CMD 命令指定的參數。如,執行docker run <image> -d
時,-d 參數將被傳遞給入口點。
也可以通過docker run --entrypoint
重寫 ENTRYPOINT 入口點。如:可以像下面這樣指定一個容器執行程序:
ENTRYPOINT ["/usr/bin/nginx"]
完整構建代碼:# Version: 0.0.3
FROM ubuntu:16.04 MAINTAINER 何民三 "cn.liuht@gmail.com" RUN apt-get update RUN apt-get install -y nginx RUN echo 'Hello World, 我是個容器' \ > /var/www/html/index.html ENTRYPOINT ["/usr/sbin/nginx"] EXPOSE 80
使用docker build構建鏡像,並將鏡像指定為 itbilu/test:
docker build -t="itbilu/test" .
構建完成后,使用itbilu/test啟動一個容器:
docker run -i -t itbilu/test -g "daemon off;"
在運行容器時,我們使用了 -g "daemon off;"
,這個參數將會被傳遞給 ENTRYPOINT,最終在容器中執行的命令為 /usr/sbin/nginx -g "daemon off;"
。
12、LABEL
LABEL用於為鏡像添加元數據,元數以鍵值對的形式指定:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
13、ARG指定傳遞給構建運行時的變量
ARG <name>[=<default value>]