Dockerfile語法由兩部分構成,注釋和命令+參數
# Line blocks used for commenting
command argument argument ..
一個簡單的例子
#第一行必須指令基于的基礎鏡像
FROM ubutu
#維護者信息
MAINTAINER docker_user docker_user@mail.com
#鏡像的操作指令
RUN apt-get update && apt-get install -y ngnix
RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf
#容器啟動時執行指令
CMD /usr/sbin/ngnix
Dockerfile 命令
FROM
基礎鏡像可以為任意鏡像。如果基礎鏡像沒有被發現,Docker將試圖從Docker image index來查找該鏡像。FROM命令必須是Dockerfile的首個命令。如果同一個DockerFile創建多個鏡像時,可使用多個FROM指令(每個鏡像一次)
# Usage: FROM [image name]
FROM ubuntu
MAINTAINER
指定維護者的信息,并應該放在FROM的后面。
# Usage: MAINTAINER [name]
MAINTAINER authors_name
RUN
RUN命令是Dockerfile執行命令的核心部分。它接受命令作為參數并用于創建鏡像。不像CMD命令,RUN命令用于創建鏡像(在之前commit的層之上形成新的層)。
格式為Run 或者Run [“executable” ,”Param1”, “param2”]
前者在shell終端上運行,即/bin/sh -C,后者使用exec運行。例如:RUN [“/bin/bash”, “-c”,”echo hello”]
每條run指令在當前基礎鏡像執行,并且提交新鏡像。當命令比較長時,可以使用“/”換行。
# Usage: RUN [command]
RUN apt-get update
USER
格式為 USER daemon 。
指定運行容器時的用戶名或UID,后續的 RUN 也會使用指定用戶。
當服務不需要管理員權限時,可以通過該命令指定運行用戶。并且可以在之前創建所需要的用戶,例如: RUN groupadd -r postgres && useradd -r -g postgres postgres 。要臨時獲取管理員權限可以使用 gosu ,而不推薦 sudo 。
# Usage: USER [UID]
USER 751
VOLUME
VOLUME命令用于讓你的容器訪問宿主機上的目錄。
格式為 VOLUME [“/data”] 。
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files", "/app_files"]
WORKDIR
WORKDIR命令用于設置CMD指明的命令的運行目錄。
格式為 WORKDIR /path/to/workdir 。
為后續的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目錄。
可以使用多個 WORKDIR 指令,后續命令如果參數是相對路徑,則會基于之前命令指定的路徑。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 最終路徑為 /a/b/c 。
CMD
支持三種格式:
CMD [“executable” ,”Param1”, “param2”]使用exec執行,推薦
CMD command param1 param2,在/bin/sh上執行
CMD [“Param1”, “param2”] 提供給ENTRYPOINT做默認參數。
每個容器只能執行一條CMD命令,多個CMD命令時,只最后一條被執行。
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"
ENV
格式為 ENV 。 指定一個環境變量,會被后續 RUN 指令使用,并在容器運行時保持。
ENV TZ "Asia/Shanghai"
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ADD
ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上復制文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載并復制到容器中。如果文件是可識別的壓縮格式,則docker會幫忙解壓縮。
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder
COPY
(基本于ADD沒有區別)
COPY 將文件從路徑 <src復制添加到容器內部路徑 <dest>。
COPY <src> <dest>
EXPOSE
指定在docker允許時指定的端口進行轉發
EXPOSE <port>[<port>...]
ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啟動后執行的命令,并且不可被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最后一個起效。
ONBUILD
ONBUILD 指定的命令在構建鏡像時并不執行,而是在它的子鏡像中執行