dockerfile文件語法命令
(1) FROM命令,支持兩種形式,構建新鏡像使用的基礎鏡像,所以源鏡像必須存在,並且是非注釋的第一條命令。
DOCKERFILEFORM <image>
FORM <image>:<tag>
# 示例: FROM nginx
(2) LABEL和MAINTAINER命令,MAINTAINER用來指定構建鏡像的作者信息,新版本docker已經摒棄,使用LABEL可以實現,LABEL保存key=value鍵值對元數據。
DOCKERFILE# 示例: # MAINTAINER "vison vison@126.com" LABEL maintainer="vison vison@126.com"
(3) RUN命令,指定鏡像中運行的命令,包含兩種模式。
DOCKERFILE# shell模式,相當於命令行的/bin/bash -c command RUN <COMMAND> # 示例: RUN echo "hello world" # exec模式,可以指定其他的shell執行指令 RUN ["executable" "param"...] # 示例: RUN ["/bin" "-c" "echo 'hello world'"]
(4) EXPOSE命令,用來指定運行該鏡像使用的端口,可以指定多個端口,但不一定暴露,在docker run中指定參數-P,不需要指定端口,端口就暴露公開了。
EXPOSE <PORT> [<PORT>...] # 注:雖然在dockerfile里指定了端口,只是告訴docker里的程序會使用該端口,但在運行時docker並不會自動打開該端口,還是需要指定端口映射,例如docker run -d -P ...
(5) CMD和ENTRYPOINT命令,指定容器運行時的默認行為,和RUN命令類似,RUN命令是在鏡像構建時執行,而CMD和ENTRYPOINT命令是在容器啟動執行。
CMD和ENTRYPOINT相同點:只能寫一條,如果寫了多條,那么只有最后一條生效,都是在容器啟動時執行。
不同點:使用docker run啟動容器指定執行命令,CMD命令會被覆蓋(不執行),ENTRYPOINT命令不會被覆蓋,如果想要覆蓋,在docker run加上參數–entrypoint。
CMD和ENTRYPOINT命令格式:
BASHCMD ["executable","param1","param2"] (exec form, this is the preferred form) CMD ["param1","param2"] (as default parameters to ENTRYPOINT) CMD command param1 param2 (shell form) ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred) ENTRYPOINT command param1 param2 (shell form)
示例:
DOCKERFILE# 只有CMD命令情況 CMD echo "hello world" # 只有ENTRYPOINT命令情況 ENTRYPOINT ["echo", "hello world"] # CMD和ENTRYPOINT都存在情況,CMD作為ENTRYPOINT的參數使用 CMD ["hello world"] ENTRYPOINT ["echo"]
一般使用entrypoint的中括號形式作為docker 容器啟動以后的默認執行命令,里面放的是不變的部分,可變部分比如命令參數可以使用cmd的形式提供默認參數,也就是run里面沒有任何參數時使用的默認參數。
(6) COPY和ADD命令,將目錄或文件復制鏡像中,兩者區別是ADD包含了類似tar的解壓縮功能,如果只是目錄或文件復制,推薦使用COPY。復制目錄時需要’/‘結尾,目錄不存在會自動創建。
DOCKERFILECOPY <src> <dest> ADD <src> <dest> # src表示來源地址,可以是本地或網絡地址,如果是本地地址,必須是鏡像的相對地址(dockerfile為參考路勁)。 # dest表示將文件復制到鏡像目標地址,必須是絕對路徑。 # 示例: COPY nginx-1.15.2.tag.gz /data/ # 單純復制文件 ADD nginx-1.15.2.tag.gz /data/ # 解壓復制文件夾
(7) VOLUME命令,在鏡像中創建掛載點,只要通過該鏡像創建的容器都有了掛載點。
DOCKERFILEVOLUME ["/data1","/data2"] # 這種方式沒有指定宿主機映射,如果使用VOLUME命令構建的新鏡像,以該鏡像運行2個容器,這兩個容器是不能共享數據的,通過執行docker inspect命令得到結果就可以看出映射到宿主機目錄完全不一樣的,所以兩個容器的數據卷不能共享。
Volumes and Dockerfiles Don’t Mix
(8) WORKDIR命令,指定工作目錄,CMD或ENTRYPOINT執行的命令都會在WORKDIR目錄下執行。
DOCKERFILEWORKDIR <PATH> # 示例: WORKDIR /a WORKDIR b WORKDIR c # 最后的工作目錄是/a/b/c
WORKDIR通常不使用絕對路勁,使用相對路勁可以一直傳遞下去。
(9) ENV命令,構建鏡像過程和容器運行過程都有效。
DOCKERFILEENV <KEY> <VALUE> ENV <KEY>=<VALUE> ... # 示例: ENV hw='hello world'
(10) USER命令,容器啟動時以什么用戶運行,默認使用root用戶。
DOCKERFILEUSER user USER user:gid USER user:group USER uid USER uid:gid USER uid:group
(11) ONBUILD命令,鏡像觸發器,當一個鏡像被其它鏡像作為基礎鏡像時執行,會在構建過程中插入指令。
DOCKERFILEONBUILD <INSTRUCTION> # 示例: ONBUILD COPY copyFile/config /data #在構建基礎鏡像的dockerfile添加下面命令,實際構建的時候不會執行COPY命令,當構建另一個新鏡像並且以該鏡像為基礎鏡像時,會執行COPY命令。
擴展:
