Docker Certified Associate(DCA)認證考試學習-Dockerfile Docker Certified Associate(DCA)認證相關資源、Dockerfile

Published on Monday, February 13, 2023

Dockerfile

在昨天文章中: Docker Certified Associate(DCA)認證考試學習-Docker Images 我們大致了解Dockerfile與腳本十分相似,並且開啟了hello-world的Dockerfile,閱讀了裡面的內容

FROM scratch
COPY hello /
CMD ["/hello"]

今天我們來看看官方文檔是怎麼說明Dockerfile
文檔我擷取了以下重點

  • Docker會從上到下讀取Dockerfile內的指令,然後根據指令自動建立一個image
  • Dockerfile 是一個文本資料,可以在裡面輸入我們平常在終端機使用的命令,告訴Docker該怎麼做
  • Dockerfile 內容開頭第一個有效指令必須是FROM
  • FROM是用來選擇某個image以作為底層
  • COPY是用來從複製A地(本機)文件到B地(image內部)
  • Dockerfile 最少必須要有一個 CMDENTRYPOINT 指令
  • 如果要將container當作成一個可執行檔,使用ENTRYPOINT
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 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

好的,有了以上資訊我們現在很清楚hello-world的Dockerfile背後到底在做什麼了

  1. 首先挑選scratch這個image作為我們的底層
  2. 之後複製hello這個可執行檔到根目錄底下
  3. 最後執行根目錄底下的hello可執行檔

接下來我們可以來試試看寫出自己第一個Dockerfile

mkdir echo
cd echo
vi echo.sh

echo.sh 新增以下內容

#!/bin/bash
echo "Hello $1, $2"

這邊記得要幫shell腳本加上執行權限

chmod +x ./echo.sh
vi Dockerfile

Dockerfile 新增以下內容

From ubuntu:18.04
COPY echo.sh /echo/
CMD ["/echo/echo.sh", "Allen", "Gao"]

此範例模仿官方hello-world image,這邊做了幾件事

  1. 選擇ubuntu作為底層
  2. 建立一個可執行的shell腳本,會根據參數回傳Hello文字
  3. 將本地文件echo.sh複製到image內部的echo資料夾
  4. 執行echo.sh並傳入兩個參數

接下來就可以請Docker根據Dockerfile的內容建構出我們第一個image了 要建構image我們需要使用build命令

docker build -t allengaodev/echo .

這邊有兩個重點:

  1. -t options 是用來指定image名稱,最好是要帳號/image名稱,才能避免重複
  2. 最後面有一個.符號,這個.很重要,它是指定建構的路徑也可以說是dockerfile的路徑

以此範例來說明我們可以使用pwd命令來顯示我們現在所在的位置
如果操作都正確你現在會在/root/echo
因為Dockerfile剛好在同一個路徑下所以我們這邊直接輸入.即可跟./代表的意思是相同的
假如我們現在位置在/root那麼我們該改用此指令

docker build -t allengaodev/echo /root/echo

在終端機會輸出目前的進度,跟run命令一樣如果找不到image會去Docker hub下載指定的image

$ docker build -t allengaodev/echo /root/echo
Sending build context to Docker daemon  3.072kB
Step 1/3 : From ubuntu:18.04
18.04: Pulling from library/ubuntu
72d9f18d70f3: Pull complete 
Digest: sha256:a3765b4d74747b5e9bdd03205b3fbc4fa19a02781c185f97f24c8f4f84ed7bbf
Status: Downloaded newer image for ubuntu:18.04
 ---> 5d2df19066ac
Step 2/3 : COPY echo.sh /echo/
 ---> 819ecbb94f99
Step 3/3 : CMD ["/echo/echo.sh", "Allen", "Gao"]
 ---> Running in 730dd6a1d2df
Removing intermediate container 730dd6a1d2df
 ---> 2d2a398d3117
Successfully built 2d2a398d3117
Successfully tagged allengaodev/echo:latest

建構成功之後可以使用docker images列出現在本地的image

REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
allengaodev/echo   latest    2d2a398d3117   4 minutes ago   63.1MB
ubuntu             18.04     5d2df19066ac   2 weeks ago     63.1MB

最後再用dotnet run執行我們第一個image

$ docker run --name myecho allengaodev/echo 
Hello Allen, Gao

Summary

今天瞭解了Dockerfile之中最基本的用法,並且成功根據Dockerfile建立出第一個image最後成功運行,結果也跟當初規劃的輸出一樣。
下一篇我們會嘗試將image分享給其他人使用。