一.Dockerfile指令上
1.指令格式
# Comment 註釋, 以#開頭
INSTRUCTION argument 以大寫的指令+參數
#First Dockerfile 註釋
FROM ubuntu:14.04
MAINTAINER dormancypress "dormancypress@outlook.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
- From
- MAINTAINER
- RUN
- EXPOSE
FROM指令
FROM <image> / FROM <image>:<tag>
MAINTAINER指令
MAINTAINER <name>
指定鏡像的做者信息,包含鏡像的全部者和聯繫信息
RUN指令
指定當前鏡像中運行的命令,包含了兩種命令模式
是以 /bin/sh -c command 形式執行命令
eg. RUN echo hello
- RUN ["executable", "param1", "param2" ] (exec模式)
RUN ["/bin/bash", "-c", "echo hello"]
鏡像分層的概念,每個run指令都會在當前鏡像的上層建立一個新的鏡像,來運行指定的命令
RUN apt-get update && apt-get install -y nginx 將兩條run指令合併成一條,會比原來的構建過程少了一步
EXPOSE指令
EXPOSE <port>[<port>...]
指定運行該鏡像的容器使用的端口,一個或多個,也能夠在一個dockerfile中使用多個expose命令。可是在run一個容器時,仍是必須指定容器的端口映射,如 docker run -p 80 -d test1 nginx。EXPOSE指令只是docker該容器內的應用程序會使用特定的端口,但出於安全的考慮,docker並不會自動的打開端口,而須要在使用時在run命令中添加對端口的映射。
二.Dockerfile指令下
- CMD 在容器運行時運行的命令
- ENTERYPOINT
- ADD 設置鏡像的目錄和文件
- COPY
- VOLUME
- WORKDIR 鏡像在構建及容器運行時的環境設置
- ENV
- USER
- ONBUILD 相似觸發器的指令
CMD指令
CMD指令用來提供容器默認運行的命令,與RUN相似,可是RUN是在鏡像構建時運行的,而CMD指定的命令是在容器運行時運行的。而且當咱們用docker run 命令啓動一個容器時,若是指定了容器運行時的命令,那麼CMD命令中的指令會被覆蓋,不會執行。CMD指令是用來指定容器運行時的默認行爲。
- CMD [ "executable", "param1", "param2"] (exec模式)
- CMD command param1 param2 (shell模式)
- CMD [ "param1", "param2"] (做爲ENTRYPOINT指令的默認參數)
ENTRYPOINT指令
ENTRYPOINT指令和CMD指令很類似,惟一的區別就是不會被docker run 命令中的指令所覆蓋(run中的指令無效)。如需覆蓋,可使用docker run --entrypoint。
- ENTRYPOINT [ "executable", "param1", "param2"] (exec模式)
- ENTRYPOINT command param1 param2 (shell模式)
ADD指令
將文件和目錄複製到使用docker構建的鏡像中。文件或者目錄的來源能夠是本地路徑,也能夠是遠程的URL。若是是本地地址必須是構建目錄中的相對地址,對於遠程URL,Docker不推薦使用,更建議使用curl和wget命令來獲取文件。目標路徑須要指定鏡像中的絕對路徑。
- ADD <src>...<dest>
- ADD ["<src>"..."<dest>"] (適用於文件路徑中有空格的狀況)
COPY指令
相似ADD指令。區別在於ADD包含相似tar的解壓功能,若是單純複製文件,docker推薦使用COPY。
- COPY <src>...<dest>
- COPY ["<src>"..."<dest>"] (適用於文件路徑中有空格的狀況)
eg. COPY index.html /usr/share/nginx/html/
VOLUME指令
VOLUME指令用來向基於鏡像建立的容器添加捲。這個目錄能夠繞過聯合文件系統,並提供如共享數據或者對數據持久化的功能。
WORKDIR指令
用來在從鏡像建立一個新容器時,在容器內部設置工做目錄。ENTERYPOINT或者CMD指定的命令都會在這個目錄下執行,咱們也可使用這個指令在構建中爲後續的指令指定工做目錄。
須要注意的是WORKDIR一般須要指定絕對路徑,若是使用了相對路徑,那麼工做路徑會一直傳遞下去。如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
OUT: /a/b/c
ENV指令
用來設置環境變量,與WORKDIR指令相似。環境變量的指令能夠做用在構建過程當中,以及在運行過程當中一樣有效。
- ENV <key> <value>
- ENV <key> <Value> ...
USER指令
用來指定鏡像會以什麼樣的用戶運行。
eg. USER nginx 基於該鏡像啓用的容器,就會以nginx用戶身份來運行。
USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
若是不使用USER指令來指定用戶,那麼默認會使用root用戶。
ONBUILD指令
ONBUILD指令可以爲鏡像添加觸發器,當一個鏡像被用做其餘鏡像的基礎鏡像時,這個觸發器會被執行。當子鏡像在構建時,會觸發觸發器中的指令。
三.Dockerfile構建過程
- 從基礎鏡像運行一個容器
- 執行一條指令,對容器作出修改
- 執行相似docker commit的操做,提交一個新的鏡像層
- 再基於剛提交的鏡像運行一個新容器
- 執行Dockerfile中的下一條指令,直至全部指令執行完畢
使用中間層鏡像進行調試 —— 查找錯誤
構建緩存
不使用緩存
- docker build --no-cache
- Dockerfile 中的 ENV REFRESH_DATE 2015-04-01 以後變再也不使用緩存
查看鏡像構建的過程