iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0

Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image.

Format

Dockerfile的格式如下:

# Comment
INSTRUCTION arguments
  • Instruction 的部分並非大小寫敏感的 (not case-sensitive),但為了能快速辨識何者為指令、何者為參數,通常會把指令以全大寫的形式書寫
  • Docker 會將在 # 符號後的文字視為註解,除非他是個 有效的  parser directives
    •  parser directives,解析器指令 (查到的中文好像是這樣),為 dockerfile 的可選項目,他會影響在他之後的其他指令運行,但不會讓映像增加新的一層,其書寫規則如下
      • 格式:# directive=value
      • 僅能夠出現、使用一次,且一但有一行注釋、空行、或被其他指令使用,這個directive 便已失效
      • 因此,parser directives 必須在 FROM 前被使用
  • Docker daemon 會一行一行的執行 dockerfile 中的指令,並也會輸出必要的指令執行結果
    • 過程中自裝置輸入的內容會被自動清除
    • 執行完成時,會顯示 image 的 ID

FROM

  • 任何一個 dockerfile 都必須以 FROM 指令開頭,(但可在 parser directives、註解、和全域的 ARGs 之後)
  • FROM 指令定義了這個 dockerfile 使用的基礎映像 (Parent Image)(新的映像須在舊映像上進行疊加)
Syntax
FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

ARG

ARG 的作用為自定義的參數,對應到docker build的指令,即是--build-arg <varName>=<value> 的部分

ENV

ENV 代表環境變數的部分

  • 環境變數可以以 $variable_name${variable_name} 標註

  • ${variable_name} 也支援一些基本的 bash modifiers:

      • ${variable:-word} indicates that if variable is set then the result will be that value. If variable is not set then word will be the result.
    • ${variable:+word} indicates that if variable is set then word will be the result, otherwise the result is the empty string.
    • In all cases, word can be any string, including additional environment variables.

    Escaping is possible by adding a \ before the variable: \$foo or \${foo}, for example, will translate to $foo and ${foo} literals respectively.

(以上來自Dockerfile reference | Docker Documentation

WORKDIR

WORKDIR 為 dockerfile 在容器中的工作目錄

RUN

目的是在容器尚未建立前執行命令,以完成像是建立環境等等的任務,有二種寫法

  1. 對應到 /bin/sh -c

shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows

RUN <command>
  • 可以使用反斜線 \ 以便將一個命令隔行書寫
  1. 對應到 exec 指令

exec form

RUN ["executable", "param1", "param2"]
  • 正常而言,以 exec 型的 RUN 運行命令時不會牽涉到殼層,因此若要執行和 shell 有關的命令時,可以使用 shell 型的 RUNRUN ["/bin/bash", "-c" "..."] 指定以shell來運行

RUN 指令會在當前映象上疊加一層並執行命令,且命令執行完成後的映像會接續給dockerfile中的下一步運行

RUN 還有其他的運作參數,在此就不在贅述,詳情可到[Dockerfile Reference](Dockerfile reference | Docker Documentation)查看

CMD

目的也是執行命令,但是只能出現一次,一旦出現就代表容器建立完成,後面就算有其他的指令像是 RUN 等,都會沒有作用

總共有三種寫法

  • CMD ["executable","param1","param2"] 

(exec form, this is the preferred form)

  • CMD ["param1","param2"] 

(as default parameters to ENTRYPOINT)

  • CMD command param1 param2 

(shell form)

要點

  • Dockerfile 中僅能有一個 CMD 的指令,若有多個 CMD 同時出現,那只有最後一個會有效果

The main purpose of a CMD is to provide defaults for an executing container
(from Dockerfile reference)

  • CMD 的目的是執行 container,也就是將container設定為預備好上工的狀態

COPY

COPY 人如其名,就是COPY

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

ADD

ADD,有兩種形式,後者會在路徑中有空格時使用。
其目的是搬移資料(包含遠端URLs),遇到壓縮檔會自己解壓縮

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

ADD GIT

ADD 也可以直接將 git 的 repo 加入,不需要使用 git 的指令

ADD [--keep-git-dir=<boolean>] <git ref> <dir>

--keep-git-dir=true 會將 .git 保留在目錄裡,預設為 false

LABEL

LABEL的功能,就是 alias

EXPOSE

此命令是將container的埠口開放,預設以 TCP 協定連線,也可以以 EXPOSE [port no.]/[protocol]的形式指定埠口和協定,
要注意的是,這個指令還是不會讓container開啟對外服務,仍須以 docker run 時的 -p 參數去設定通訊埠轉發,container才會真正的接收來自外部的請求。

以上是幾個比較常用到的命令,docker reference上還有很多很多的資料,有興趣的話可以上去看看喔~明天就來實際撰寫一個dockerfile吧


上一篇
Run, Run, Docker Run
下一篇
DockerFile-2
系列文
從認識Docker到精通30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言