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 最少必須要有一個
CMD
或ENTRYPOINT
指令 - 如果要將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背後到底在做什麼了
- 首先挑選scratch這個image作為我們的底層
- 之後複製hello這個可執行檔到根目錄底下
- 最後執行根目錄底下的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,這邊做了幾件事
- 選擇ubuntu作為底層
- 建立一個可執行的shell腳本,會根據參數回傳Hello文字
- 將本地文件echo.sh複製到image內部的echo資料夾
- 執行echo.sh並傳入兩個參數
接下來就可以請Docker根據Dockerfile的內容建構出我們第一個image了 要建構image我們需要使用build命令
docker build -t allengaodev/echo .
這邊有兩個重點:
- -t options 是用來指定image名稱,最好是要帳號/image名稱,才能避免重複
- 最後面有一個
.
符號,這個.
很重要,它是指定建構的路徑也可以說是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分享給其他人使用。