1、Dockerfile指令
(1)指令格式 ①註釋 #Comment
②指令 INSTRUCTION argument
(2)第一個Dockerfile
①FROM FROM <image> 或 FROM <image>:<tag> 必須是一個存在的鏡像,基礎鏡像,必須是第一條非註釋的指令
②MAINTAINER MAINTAINER <name> 指定鏡像的作者信息,包含鏡像的所有者和聯繫信息
③RUN 指定當前鏡像中運行的命令
RUN <command> (shhell 模式)
/bin/sh -c command
RUN ["executable", "param1", "param2"] (exec模式)
RUN["/bin/bash", "-c", "echo hello"]
④EXPOSE EXPOSE <port> [<port>...] 指定運行該鏡像的容器使用的端口
(3)其他指令
①CMD 容器運行時執行,區別於RUN指令(在鏡像構建過程中)
CMD <command> param1 param2 (shhell 模式)
CMD ["executable", "param1", "param2"] (exec模式)
CMD ["param1", "param2"] (作爲 ENTERYPOINT 指令的默認參數)
利用該Dockerfile構建鏡像,如下
利用構建出的鏡像啓動一個容器
如果在運行容器時指定運行的命令如下,則會覆蓋CMD指令中的命令,如下
②ENTERYPOINT ENTERYPOINT ["executable", "param1", "param2"] (exec模式)
ENTERYPOINT command param1 param2 (shell模式)
與CMD指令類似,不同的是:默認在容器啓動時指定得命令不會覆蓋dockerfile文件中ENTERYPOINT 指令;
如果需要覆蓋,可以使用docker run --enterypoint 進行覆蓋
③ADD ADD <src> ...<dest> 或者 ADD ["<src>"..."<dest>"](適用於文件路徑中有空格的情況)
④COPY COPY <src> ...<dest> 或者 COPY ["<src>"..."<dest>"](適用於文件路徑中有空格的情況)
ADD vs. COPY:
ADD 包含類似tar的解壓功能;如果單純複製文件,Docker推薦使用COPY指令
⑤VOLUME VOLUME ["/data"] 用於向 基於鏡像構建的容器 添加捲
⑥WORKDIR 用於在基於鏡像構建的容器中指定工作目錄
WORKDIR /path/to/workdir 應該使用絕對路徑,如果使用了相對路徑,則路徑會發生傳遞
比如 WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd 結果爲 /a/b/c
⑦ENV 用於設置環境變量,與WORKDIR類似
ENV <key> <value> 或者 ENV <key>=<value>...
⑧USER 指定鏡像會以什麼樣的用戶去運行 USER daemon
如:USER nginx 基於該鏡像啓動的容器,就會以nginx用戶的身份運行
也可以在USER指令中使用uid、 group、 gid,或者是這4種的組合使用,例如:
USER user USER user:group USER user:gid
USER uid USER uid:gid USER uid:group
⑨ONBUILD 用於爲鏡像添加觸發器 ONBUILD [INSTRUCTION]
鏡像觸發器:當一個鏡像被其他鏡像作爲基礎鏡像時執行,會在構建過程中插入指令
2、Dockerfile構建過程
(1)從基礎鏡像運行一個容器; 執行一條指令,對容器做出修改; 執行類似docker commit的操作,提交一個新的鏡像層;
再基於剛提交的鏡像運行一個新容器; 執行dockerfile中的下一條指令,直至所有指令執行完畢
這樣我們就可以利用這些中間層鏡像進行調試
(2)構建緩存,例如:
如果不想使用緩存:docker build --no-cache
(3)查看鏡像構建的過程: docker history [image]