Dockfile 的語法
阿新 • • 發佈:2018-12-02
Dockerfile命令 Dockerfile有十幾條命令可用於構建映象,下文將簡略介紹這些命令:
- 在linux作業系統上預設 /bin/sh -c
- 在windows作業系統上預設 cmd /S /C
- RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
- RUN ["/bin/bash", "-c", "echo hello"]
- CMD [ "sh", "-c", "echo $HOME"
- CMD [ "echo", "$HOME" ]
- ADD test relativeDir/
- ADD test /relativeDir
- ADD http://example.com/foobar /
- 只能寫一條,如果寫了多條,那麼只有最後一條生效
- 容器啟動時才執行,執行時機相同
- ENTRYPOINT不會被執行的command覆蓋,而CMD則會被覆蓋
- 如果我們在Dockerfile種同時寫了ENTRYPOINT和CMD,並且CMD指令不是一個完整的可執行命令,那麼CMD指定的內容將會作為ENTRYPOINT的引數
- 如果我們在Dockerfile種同時寫了ENTRYPOINT和CMD,並且CMD是一個完整的指令,那麼它們兩個會互相覆蓋,誰在最後誰生效
|
NO ENTRYPOINT | ENTRYPOINT exec_entry p1_entry | ENTRYPOINT ["exec_entry", "p1_entry"] |
No CMD | error, not allowed | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry |
CMD ["exec_cmd", "p1_cmd"] | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry exec_cmd p1_cmd |
CMD ["p1_cmd", "p2_cmd"] | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry p1_cmd p2_cmd |
CMD exec_cmd p1_cmd | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
10.VOLUME ,這個是用來指 定掛載點的 可實現掛載功能,可以將內地資料夾或者其他容器種得資料夾掛在到這個容器中 語法為: VOLUME ["/data"] 說明: ["/data"]可以是一個JsonArray ,也可以是多個值。所以如下幾種寫法都是正確的 VOLUME ["/var/log/"] VOLUME /var/log VOLUME /var/log /var/db 一般的使用場景為需要持久化儲存資料時 容器使用的是AUFS,這種檔案系統不能持久化資料,當容器關閉後,所有的更改都會丟失。 所以當資料需要持久化時用這個命令。 格式: VOLUME [ "/data" ] VOLUME命令將建立一個可以從本地主機或其他容器掛載的掛載點,與我們之前使用的-v選項是一樣的。 11.USER , 指定執行容器的使用者: 設定啟動容器的使用者,可以是使用者名稱或UID,所以,只有下面的兩種寫法是正確的
- USER daemo
- USER UID
格式: USER daemon 12.WORKDIR ,指定命令的工作目錄: 語法: WORKDIR /path/to/workdir 設定工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在則會建立,也可以設定多次。 如: WORKDIR /a WORKDIR b WORKDIR c RUN pwd pwd執行的結果是/a/b/c WORKDIR也可以解析環境變數 如: ENV DIRPATH /path WORKDIR $DIRPATH/$DIRNAME RUN pwd pwd的執行結果是/path/$DIRNAME
格式: WORKDIR /path/to/workdir 為後續的RUN、CMD或者ENTRYPOINT執行的命令指定一個工作目錄。 ARG 語法: ARG <name>[=<default value>] 設定變數命令,ARG命令定義了一個變數,在docker build建立映象的時候,使用 --build-arg <varname>=<value>來指定引數 如果使用者在build映象時指定了一個引數沒有定義在Dockerfile中,那麼將有一個Warning 提示如下: [Warning] One or more build-args [foo] were not consumed. 我們可以定義一個或多個引數,如下: FROM busybox ARG user1 ARG buildno ... 也可以給引數一個預設值: FROM busybox ARG user1=someuser ARG buildno=1 ... 如果我們給了ARG定義的引數預設值,那麼當build映象時沒有指定引數值,將會使用這個預設值 ONBUILD 語法: ONBUILD [INSTRUCTION] 這個命令只對當前映象的子映象生效。 比如當前映象為A,在Dockerfile種新增: ONBUILD RUN ls -al 這個 ls -al 命令不會在A映象構建或啟動的時候執行 此時有一個映象B是基於A映象構建的,那麼這個ls -al 命令會在B映象構建的時候被執行。 STOPSIGNAL 語法: STOPSIGNAL signal STOPSIGNAL命令是的作用是當容器推出時給系統傳送什麼樣的指令 HEALTHCHECK 容器健康狀況檢查命令 語法有兩種: 1. HEALTHCHECK [OPTIONS] CMD command 2. HEALTHCHECK NONE 第一個的功能是在容器內部執行一個命令來檢查容器的健康狀況 第二個的功能是在基礎映象中取消健康檢查命令 [OPTIONS]的選項支援以下三中選項: --interval=DURATION 兩次檢查預設的時間間隔為30秒 --timeout=DURATION 健康檢查命令執行超時時長,預設30秒 --retries=N 當連續失敗指定次數後,則容器被認為是不健康的,狀態為unhealthy,預設次數是3 注意: HEALTHCHECK命令只能出現一次,如果出現了多次,只有最後一個生效。 CMD後邊的命令的返回值決定了本次健康檢查是否成功,具體的返回值如下: 0: success - 表示容器是健康的 1: unhealthy - 表