docker容器中的Dockerfile檔案命令記錄
補充
對於一個 docker 映象,我們可以這麼來理解 ENTRYPOINT 與 CMD 的關係
如果沒有定義 ENTRYPOINT, CMD 將作為它的 ENTRYPOINT
定義了 ENTRYPOINT 的話,CMD 只為 ENTRYPOINT 提供引數
容器執行的最終入口由 ENTRYPOINT 和實際的 CMD 拼接而成
注:ENTRYPOINT 同樣可以被覆蓋,如 docker run --entrypoint ls test -l /,將會執行 ls -l / 命令。
Docker 可以通過 Dockerfile 的內容來自動構建映象。
Dockerfile 是一個包含建立映象所有命令的文字檔案,通過docker build命令可以根據 Dockerfile 的內容構建映象,在介紹如何構建之前先介紹下 Dockerfile 的基本語法結構。
Dockerfile 有以下指令選項:
- FROM
- MAINTAINER
- RUN
- CMD
- EXPOSE
- ENV
- ADD
- COPY
- ENTRYPOINT
- VOLUME
- USER
- WORKDIR
- ONBUILD
FROM命令
用法
FROM <image> 或者FROM <image>:<tag>
- FROM指定構建映象的基礎源映象,如果本地沒有指定的映象,則會自動從 Docker 的公共庫 pull 映象下來。
- FROM必須是 Dockerfile 中非註釋行的第一個指令,即一個 Dockerfile 從FROM語句開始。
- FROM可以在一個 Dockerfile 中出現多次,如果有需求在一個 Dockerfile 中建立多個映象。
- 如果FROM語句沒有指定映象標籤,則預設使用latest標籤。
MAINTAINER
用法
MAINTAINER <name>
- 指定建立映象的使用者
CMD
CMD有三種使用方式:
CMD "executable","param1","param2"
CMD "param1","param2"
CMD command param1 param2 (shell form)
- CMD指定在 Dockerfile 中只能使用一次,如果有多個,則只有最後一個會生效。
- CMD的目的是為了在啟動容器時提供一個預設的命令執行選項。如果使用者啟動容器時指定了執行的命令,則會覆蓋掉CMD指定的命令。
- CMD會在啟動容器的時候執行,build 時不執行,而RUN只是在構建映象的時候執行,後續映象構建完成之後,啟動容器就與RUN無關了
EXPOSE
用法
EXPOSE <port> [<port>...]
- 告訴 Docker 服務端容器對外對映的本地埠,需要在 docker run 的時候使用-p或者-P選項生效。
例:docker container run -p 8000:3000 -it koa-demo /bin/bash
ENV
用來設定環境變數,常用的比如設定JDK變數
ENV <key> <value> # 只能設定一個變數
ENV <key>=<value> ... # 允許一次設定多個變數
ADD 和 COPY
這兩個命令基本是一樣的,唯一的不同就是COPY不能指定遠端檔案 URLS。
ADD <src>... <dest>
- ADD複製本地主機檔案、目錄或者遠端檔案 URLS 從 並且新增到容器指定路徑中 。
- 支援通過 Go 的正則模糊匹配
- 路徑必須是絕對路徑,如果 不存在,會自動建立對應目錄
- 路徑必須是 Dockerfile 所在路徑的相對路徑
- 如果是一個目錄,只會複製目錄下的內容,而目錄本身則不會被複制
ENTRYPOINT
ENTRYPOINT "executable", "param1", "param2"
ENTRYPOINT command param1 param2 (shell form)
- 配置容器啟動後執行的命令,並且不可被 docker run 提供的引數覆蓋,而CMD是可以被覆蓋的。如果需要覆蓋,則可以使用docker run –entrypoint選項。
- 每個 Dockerfile 中只能有一個ENTRYPOINT,當指定多個時,只有最後一個生效。
Exec form ENTRYPOINT 例子
通過ENTRYPOINT使用 exec form 方式設定穩定的預設命令和選項,而使用CMD新增預設之外經常被改動的選項。
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
通過 Dockerfile 使用ENTRYPOINT展示前臺執行 Apache 服務
FROM debian:stable
RUN apt-get update && apt-get install -y --force-yes apache2
EXPOSE 80 443
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
Shell form ENTRYPOINT 例子
這種方式會在/bin/sh -c中執行,會忽略任何CMD或者docker run命令列選項,為了確保docker stop能夠停止長時間執行ENTRYPOINT的容器,確保執行的時候使用exec選項。
FROM ubuntu
ENTRYPOINT exec top -b
VOLUME
VOLUME ["/data"]
建立一個可以從本地主機或其他容器掛載的掛載點,後續具體介紹。
USER
USER daemon
- 指定執行容器時的使用者名稱或 UID,後續的RUN、CMD、ENTRYPOINT也會使用指定使用者。
WORKDIR
WORKDIR /path/to/workdir
- 為後續的RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,後續命令如果引數是相對路徑,則會基於之前命令指定的路徑。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最終路徑是/a/b/c。
WORKDIR指令可以在ENV設定變數之後呼叫環境變數:
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
最終路徑則為 /path/$DIRNAME。