1. 程式人生 > >docker容器中的Dockerfile檔案命令記錄

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。