本文來自技術分享node
格式:python
shell 格式:COPY <源路徑> ... <目標路徑> nginx
exec 格式:COPY [" <源路徑1> ",... " <目標路徑> "] git
說明:github
兩種格式,一種相似於命令行,一種相似於函數調用。web
COPY 指令將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置。 redis
示例:docker
COPY package.json /usr/src/app/shell
<源路徑> 能夠是多個,甚至能夠是通配符,其通配符規則要知足 Go 的 filepath.Match 規則,如: 數據庫
COPY hom* /mydir/ COPY hom?.txt /mydir/
格式:
ADD <源路徑> ... <目標路徑>
ADD [" <源路徑1> ",... " <目標路徑> "]
說明:
ADD 指令和 COPY 的格式和性質基本一致。可是在COPY 基礎上增長了一些功能。
<源路徑> 能夠是一個 URL ,這種狀況下,Docker引擎會試圖去下載這個連接的文件放到 <目標路徑> 去。下載後的文件權限自動設置爲 600 ,若是這並非想要的權限,那麼還須要增長額外的一層 RUN 進行權限調整,另外,若是下載的是個壓縮包,須要解壓縮,也同樣還須要額外的一層 RUN 指令進行解壓縮。不推薦使用。
若是 <源路徑> 爲一個 tar 壓縮文件的話,壓縮格式爲 gzip , bzip2 以及 xz 的狀況下, ADD 指令將會自動解壓縮這個壓縮文件到 <目標路徑> 去。
示例:
ADD mqtt-service.sh $MQTT_SERVICE/
格式:
CMD 指令的格式和 RUN 類似,也是兩種格式:
l shell 格式: CMD <命令>
l exec 格式: CMD ["可執行文件", "參數1", "參數2"...]
l 參數列表格式: CMD ["參數1", "參數2"...] 。在指定了 ENTRYPOINT 指令後,用 CMD 指定具體的參數
說明:
Docker 不是虛擬機,容器就是進程。既然是進程,那麼在啓動容器的時候,須要指定所運行的程序及參數。 CMD 指令就是用於指定默認的容器主進程的啓動命令的。
在運行時能夠指定新的命令來替代鏡像設置中的這個默認命令,好比, ubuntu 鏡像默認的CMD 是 /bin/bash ,若是咱們直接 docker run -it ubuntu 的話,會直接進入 bash 。咱們也能夠在運行時指定運行別的命令,如 docker run -it ubuntu cat /etc/os-release 。這就是用 cat /etc/os-release 命令替換了默認的 /bin/bash 命令了,輸出了系統版本信息。在指令格式上,通常推薦使用 exec 格式,這類格式在解析時會被解析爲 JSON 數組,所以必定要使用雙引號 " ,而不要使用單引號。
若是使用 shell 格式的話,實際的命令會被包裝爲 sh -c 的參數的形式進行執行。好比:
CMD echo $HOME
在實際執行中,會將其變動爲:
CMD [ "sh", "-c", "echo $HOME" ]
格式:
l shell 格式: ENTRYPOINT <命令>
l exec 格式: ENTRYPOINT ["可執行文件", "參數1", "參數2"...]
說明:
ENTRYPOINT 的格式和 RUN 指令格式同樣,分爲 exec 格式和 shell 格式。
ENTRYPOINT的目的和CMD 同樣,都是在指定容器啓動程序及參數。ENTRYPOINT 在運行時也能夠替代,不過比 CMD 要略顯繁瑣,須要經過 docker run 的參數 --entrypoint 來指定。
當指定了 ENTRYPOINT 後, CMD 的含義就發生了改變,再也不是直接的運行其命令,而是將CMD 的內容做爲參數傳給 ENTRYPOINT 指令,換句話說實際執行時,將變爲:
示例:
ENTRYPOINT ["./mqtt-service.sh"]
格式:
ENV
ENV
說明:
這個指令很簡單,就是設置環境變量而已,不管是後面的其它指令,如 RUN ,仍是運行時的應用,均可以直接使用這裏定義的環境變量。
下列指令能夠支持環境變量展開:
ADD 、 COPY 、 ENV 、 EXPOSE 、 LABEL 、 USER 、 WORKDIR 、 VOLUME 、 STOPSIGNAL 、 ONBUILD 。
格式:
ARG <參數名> [= <默認值> ]
說明:
構建參數和 ENV 的效果同樣,都是設置環境變量。所不一樣的是, ARG 所設置的構建環境的環境變量,在未來容器運行時是不會存在這些環境變量的。
Dockerfile 中的 ARG 指令是定義參數名稱,以及定義其默認值。該默認值能夠在構建命令docker build 中用 --build-arg <參數名> = <值> 來覆蓋。
格式:
VOLUME [" <路徑1> ", " <路徑2> "...]
VOLUME <路徑>
說明:
容器運行時應該儘可能保持容器存儲層不發生寫操做,對於數據庫類須要保存動態數據的應用,其數據庫文件應該保存於卷(volume)中。爲了防止運行時用戶忘記將動態文件所保存目錄掛載爲卷,在Dockerfile 中,咱們能夠事先指定某些目錄掛載爲匿名卷,這樣在運行時若是用戶不指定掛載,其應用也能夠正常運行,不會向容器存儲層寫入大量數據。
VOLUME /data
這裏的 /data 目錄就會在運行時自動掛載爲匿名卷,任何向 /data 中寫入的信息都不會記錄進容器存儲層,從而保證了容器存儲層的無狀態化。固然,運行時能夠覆蓋這個掛載設置。好比:
docker run -d -v mydata:/data xxxx
在這行命令中,就使用了 mydata 這個命名卷掛載到了 /data 這個位置,替代了Dockerfile 中定義的匿名卷的掛載配置。
格式:
EXPOSE <端口1> [ <端口2> ...]
說明:
EXPOSE 指令是聲明運行時容器提供服務端口,這只是一個聲明,在運行時並不會由於這個聲明應用就會開啓這個端口的服務。在 Dockerfile 中寫入這樣的聲明有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射;另外一個用處則是在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。
示例:
EXPOSE 8080/tcp
格式:
WORKDIR <工做目錄路徑>
說明:
使用 WORKDIR 指令能夠來指定工做目錄( 或者稱爲當前目錄) ,之後各層的當前目錄就被改成指定的目錄,如該目錄不存在, WORKDIR 會幫你創建目錄。
示例:
WORKDIR ${MQTT_SERVICE}
格式:
USER <用戶名>
說明:
USER 指令和 WORKDIR 類似,都是改變環境狀態並影響之後的層。 WORKDIR 是改變工做目錄, USER 則是改變以後層的執行 RUN , CMD 以及 ENTRYPOINT 這類命令的身份。
若是以 root 執行的腳本,在執行期間但願改變身份,好比但願以某個已經創建好的用戶來運行某個服務進程,不要使用 su 或者 sudo ,這些都須要比較麻煩的配置,並且在 TTY 缺失的環境下常常出錯。建議使用 gosu 。
# 創建 redis 用戶,並使用 gosu 換另外一個用戶執行命令 RUN groupadd -r redis && useradd -r -g redis redis # 下載 gosu RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-amd64" \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true # 設置 CMD,並以另外的用戶執行 CMD [ "exec", "gosu", "redis", "redis-server" ]
格式:
HEALTHCHECK [選項] CMD <命令> :設置檢查容器健康情況的命令
HEALTHCHECK NONE :若是基礎鏡像有健康檢查指令,使用這行能夠屏蔽掉其健康檢查指令
說明:
HEALTHCHECK 指令是告訴 Docker 應該如何進行判斷容器的狀態是否正常,這是 Docker 1.12引入的新指令。
HEALTHCHECK 支持下列選項:
--interval= <間隔> :兩次健康檢查的間隔,默認爲 30 秒;
--timeout= <時長> :健康檢查命令運行超時時間,若是超過這個時間,本次健康檢查就被 視爲失敗,默認 30 秒;
--retries= <次數> :當連續失敗指定次數後,則將容器狀態視爲 unhealthy ,默認 3次。
示例:
FROM nginx RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* HEALTHCHECK --interval=5s --timeout=3s CMD curl -fs http://localhost/ || exit 1
健康檢查命令的輸出( 包括 stdout 以及 stderr ) 都會被存儲於健康狀態裏,能夠用 docker inspect 來查看
$ docker inspect --format '{{json .State.Health}}' web | python -m json.tool
格式:
ONBUILD <其它指令>
說明:
ONBUILD 是一個特殊的指令,它後面跟的是其它指令,好比 RUN , COPY 等,而這些指令,在當前鏡像構建時並不會被執行。只有當以當前鏡像爲基礎鏡像,去構建下一級鏡像的時候纔會被執行。
示例:
FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ]
構建鏡像my-node
FROM my-node
這個鏡像構建時會執行以上ONBUILD中的三個命令。