官方建議指令越少越好,每個指令都會建立一層,極佔空間。linux
指定目前須要構建鏡像的基礎鏡像docker
FROM [--platform=<platform>] <image> [AS <name>] FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] FROM [--platform=<platform>] <image>[@<digest>] [AS <name>] # --platform 可選 用於指定構建的平臺,默認不填爲本機平臺 # image 必填 鏡像名 全部鏡像默認繼承scratch鏡像 # tag 可選 鏡像標籤,默認爲latest # digest 可選 摘要,默認爲latest # AS 可選 別名,用於後續的鏡像階段構建 # FROM --platform=linux/amd64 mongo:4.3 AS db
兩種寫法,bash-like或者json-likeshell
RUN <command>
shell-like寫法,直接執行命令,在Linux中默認執行 /bin/sh -c
,Windows中默認執行 cmd /S /C
# 使用反斜槓換行書寫 RUN /bin/bash -c 'source $HOME/.bashrc; \ echo $HOME'
RUN ["executable", "param1", "param2"]
# 參數是json-like書寫格式,須要使用雙引號 # json-like寫法不支持「$HELLO」的環境變量 RUN ["/bin/bash", "-c", "echo hello"]
與RUN命令區別在於,RUN命令直接執行並提交結果,CMD只是將命令存下來,等容器啓動時才執行;與ENTRYPOINGT命令配合使用效果更佳json
CMD ["executable","param1","param2"]
json-likeCMD ["param1","param2"]
做爲ENTERYPOINT指令的默認參數CMD command param1 param2
shell-likedemo區分RUN和CMDubuntu
FROM alpine RUN echo "hahaha run test" CMD ["echo","hahahaha CMD"]
[root@seeter hu5ky]# docker build -t test:testruncommond . Sending build context to Docker daemon 2.56kB Step 1/3 : FROM alpine ---> cc0abc535e36 Step 2/3 : RUN echo "hahaha run test" ---> Running in b3d0cb324936 hahaha run test ----------> RUN命令直接執行 Removing intermediate container b3d0cb324936 ---> e920fa254b3e Step 3/3 : CMD ["echo","hahahaha CMD"] ---> Running in bd23af78c1e0 -----------> 不執行 Removing intermediate container bd23af78c1e0 ---> 1ec19a656013 Successfully built 1ec19a656013 Successfully tagged test:testruncommond --------------------------- [root@seeter hu5ky]# docker run test:testruncommond hahahaha CMD ---------> docker run後纔會執行
用來設定docker鏡像的metadata(鏡像的描述數據相似位置,大小,做者等),以鍵值對的形式存在bash
LABEL <key>=<value> <key>=<value> <key>=<value> ... ------------ # 多標籤寫法 LABEL "auth"="hu5ky" LABEL "time"="2020/04/27" # 單標籤單行寫法 LABEL "auth"="hu5ky" "time"="2020/04/27" # 單標籤多行寫法(我的推薦) LABEL "auth"="hu5ky" \ "time"="2020/04/27"
demo網絡
[root@firevision-aibuilding-test zc]# docker image inspect --format='{{.Config.Labels}}' test:testruncommond map[auth:hu5ky time:2020/04/27]
MAINTAINER <name> <email>
鏡像建立者 官方不推薦使用,可使用app
LABEL maintainer="SvenDowideit@home.org.au" eg.
用於在運行時暴露容器端口並指定協議,未指定協議則默認爲TCPtcp
EXPOSE <port> [<port>/<protocol>...] EXPOSE 80/tcp EXPOSE 80/udp
EXPOSE
能夠配合-P/-p命令使用:ide
-P
當使用 -P 標記時,Docker 會隨機映射一個 49000~49900 的端口到內部容器開放的網絡端口。-p
-p(小寫)則能夠指定要映射的IP和端口,可是在一個指定端口上只能夠綁定一個容器。支持的格式有hostPort:containerPort
ip:hostPort:containerPort
ip::containerPort
。-p命令會直接忽略 EXPOSE
中的端口.k-v鍵值對,用於設定環境變量
ENV <key> <value>
# 一次設置一個ENV <key>=<value> ...
# 一次設置多個在docker run --env
時能夠對Fockerfile的ENV
參數進行修改
將宿主機的文件或遠程文件添加到容器內部
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
若是文件路徑包含空格,使用這種方式。demo
# 支持通配符寫法 ADD --chown=55:mygroup files* /somedir/ ADD --chown=bin files* /somedir/ ADD --chown=1 files* /somedir/ ADD --chown=10:11 files* /somedir/ # --chown 可選 指定用戶與組對應關係 # src 必填 宿主機文件或者url 若是爲URL須要權限驗證,嘖須要第三方工具下載,ADD命令不支持驗權 # dest 必填 docker內部路徑
ADD
命令遵循如下規則
src
中的路徑不能夠是相對路徑,錯誤寫法:ADD ../something /something
。由於Dockerfile第一步就是將當前上下文以及子路徑發送到docker daemon中。../
的寫法不被支持。src
是一個URL,且dest
最後不以斜槓/
結尾,則URL中文件被下載並拷貝到dest
中。若是src
是一個URL,則docker自動將url最後的名稱做爲目標路徑的文件名。
# 正確用法 ADD http://example.com/foobar / # 最後會出現/foobar文件 # 錯誤寫法 ADD http://example.com / # 無效
src
是一個目錄,則整個目錄都會被拷貝,包括文件系統的metadata,可是文件夾不會被拷貝,只會拷貝其中的內容。src
是一個壓縮包,則會被解壓到dest
中同ADD
,只是src
不能爲URL
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
ENTRYPOINT ["executable", "param1", "param2"]
json-likeENTRYPOINT command param1 param2
bash-like與CMD
比較
docker run
指定command時,CMD
指令會被覆蓋,而ENTRYPOINT
不會demo
FROM ubuntu CMD echo hahahahahahCMD ENTRYPOINT ["echo", "hahahahha entrypoint"] ENTRYPOINT echo hahahhhahahahENTRYPOINT
# ENTRYPOINT 不會被覆蓋 [root@seeter hu5ky]# docker run test:test echo hahahahecho hahahhhahahahENTRYPOINT
FROM ubuntu CMD echo hahahahahahCMD
# CMD被command替換 [root@seeter hu5ky]# docker run test:test echo hahahahecho hahahahecho
CMD
和ENTRYPOINT
同時使用時,CMD
將做爲ENTRYPOINT
的參數。demo
FROM ubuntu CMD echo hahahahahahCMD ENTRYPOINT ["echo", "hahahahha entrypoint"]
# CMD被視爲ENTRYPOINT參數 [root@seeter hu5ky]# docker run test:test hahahaha entrypoint echo hahahaha CMD
ENTRYPOINT
同時使用時,最後一個ENTRYPOINT
生效。demo
FROM ubuntu CMD echo hahahahahahCMD ENTRYPOINT ["echo", "hahahahha entrypoint"] ENTRYPOINT echo hahahhhahahahENTRYPOINT
[root@seeter hu5ky]# docker run test:test hahahhhahahahENTRYPOINT
VOLUME ["/data"]
VOLUME /data
做用僅僅是建立一個匿名掛載點,指定host存儲時,需使用docker run -v
USER <user>[:<group>]
USER <UID>[:<GID>]
爲WORKDIR
後的全部命令指定運行目錄
WORKDIR /path/to/workdir
demo
# 若是使用屢次`WORKDIR`指令,且第一個是絕對路徑,後面的是相對路徑,則後續的全部路徑就將追加在前一個路徑中 FROM ubuntu WORKDIR /app WORKDIR hu5ky RUN pwd CMD echo hahahahahahCMD VOLUME /home/hu5ky/volume/ /app/volume/
[root@seeter hu5ky]# docker build -t test:test . Sending build context to Docker daemon 3.072kB Step 1/6 : FROM ubuntu ---> 1d622ef86b13 Step 2/6 : WORKDIR /app ---> Running in 252cabc124c2 Removing intermediate container 252cabc124c2 ---> 0577acce038d Step 3/6 : WORKDIR hu5ky ---> Running in 83a45ee392c2 Removing intermediate container 83a45ee392c2 ---> 8e3a8ccfd5b4 Step 4/6 : RUN pwd ---> Running in c66ebc01af08 /app/hu5ky ----------->完整路徑 ···
demo
# 能夠結合環境變量使用 FROM ubuntu ENV DIRPATH /app WORKDIR $DIRPATH WORKDIR hu5ky/$PPP RUN pwd
[root@seeter hu5ky]# docker build -t test:test . Sending build context to Docker daemon 3.072kB Step 1/5 : FROM ubuntu ---> 1d622ef86b13 Step 2/5 : ENV DIRPATH /app ---> Using cache ---> 072a81455e5d Step 3/5 : WORKDIR $DIRPATH ---> Running in 1c40421a9bb3 Removing intermediate container 1c40421a9bb3 ---> 881bb05f37ce Step 4/5 : WORKDIR hu5ky/$PPP ---> Running in 055cbeedebda Removing intermediate container 055cbeedebda ---> 36b3343fa7cc Step 5/5 : RUN pwd ---> Running in f4ee0bbb3182 /app/hu5ky ---------> 輸出路徑 Removing intermediate container f4ee0bbb3182 ---> 8a6c3f753250 Successfully built 8a6c3f753250 Successfully tagged test:test
ARG <name>[=<default value>]
缺省值會被--build-arg <varname>=<value>
替換用戶能夠經過docker build
中的--build-arg <varname>=<value>
參數來指定,若是Dockerfile中沒有指定ARG
參數,在build時會報出warning
demo
FROM ubuntu ARG user RUN echo $user
[root@firevision-kgm-test zhangc]# docker build --build-arg user=what_user . Sending build context to Docker daemon 2.048kB Step 1/3 : FROM ubuntu ---> 1d622ef86b13 Step 2/3 : ARG user ---> Running in 46f865af728e Removing intermediate container 46f865af728e ---> 3742534d7867 Step 3/3 : RUN echo $user ---> Running in 5535d80b3b89 what_user. ------> 輸出 Removing intermediate container 5535d80b3b89 ---> 856eec9724e5 Successfully built 856eec9724e5
同時使用ARG
和ENV
指令,以ENV
的參數爲準,通常來講ENV
的優先級高於ARG
demo
FROM ubuntu ARG CONT_IMG_VER ENV CONT_IMG_VER v1.0.0 RUN echo $CONT_IMG_VER
[root@seeter hu5ky]# docker build --build-arg CONT_IMG_VER=v2.0.1 . Sending build context to Docker daemon 3.072kB Step 1/4 : FROM ubuntu ---> 1d622ef86b13 Step 2/4 : ARG CONT_IMG_VER ---> Using cache ---> 993483f26804 Step 3/4 : ENV CONT_IMG_VER v1.0.0 ---> Running in 2535a58ab1d4 Removing intermediate container 2535a58ab1d4 ---> bc3012e82989 Step 4/4 : RUN echo $CONT_IMG_VER ---> Running in c55abb96daf7 v1.0.0. ---------> env指令的參數 Removing intermediate container c55abb96daf7 ---> 114fc834f42d Successfully built 114fc834f42d
結合ENV
和ARG
使用demo
FROM ubuntu ARG CONT_IMG_VER ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0} RUN echo $CONT_IMG_VER
[root@seeter hu5ky]# docker build . Sending build context to Docker daemon 3.072kB Step 1/4 : FROM ubuntu ---> 1d622ef86b13 Step 2/4 : ARG CONT_IMG_VER ---> Running in 2ccf8e734837 Removing intermediate container 2ccf8e734837 ---> af95bb2aeb4b Step 3/4 : ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0} ---> Running in 3bf09240355e Removing intermediate container 3bf09240355e ---> d845d51f801f Step 4/4 : RUN echo $CONT_IMG_VER ---> Running in 8b34d0bd089b v1.0.0 Removing intermediate container 8b34d0bd089b ---> e00f86d7c62a Successfully built e00f86d7c62a
ARG
指令有一組預約義的參數,不須要在Dockerfile中指定
HTTP_PROXY http_proxy HTTPS_PROXY https_proxy FTP_PROXY ftp_proxy NO_PROXY no_proxy
直接在--build-arg <varname>=<value>
中指定便可
ONBUILD <INSTRUCTION>
STOPSIGNAL signal
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
SHELL ["executable", "parameters"]
必須爲json-like