經過昨天對 Dockerfile 的全面了解,今天我們將實際動手為 RSS 閱讀器專案寫一個 Dockerfile。這個步驟對於將我們的專案成功部署到上線環境來說,是非常重要的。
首先,打開你的專案目錄,然後建立一個名為 Dockerfile
的檔案,內容講解如下:
我們的專案是用 Go 語言開發的,所以我們會使用 Go 的官方 image 作為基底,再接續做我們的建置工作。這樣就不需要先設定 Go 編譯環境,很像 VM 的 virtual disk 檔案的概念。
FROM golang:1.20
指定一個容器內的工作目錄。如果有我們的 container 在執行期間有產生任何檔案,預設都會跑到這邊,當使用相對目錄呼叫指令時,也會先從此目錄開始尋找是否有符合的檔案,除非使用絕對路徑指定或是呼叫 cd
切換工作目錄。
WORKDIR /app
複製你的專案 source code 到工作目錄並安裝必要的依賴。
COPY . .
RUN go mod download
接著,編譯專案。
RUN go build -o main .
最後,設定當容器啟動時需要執行的命令。
CMD ["./main"]
完整的Dockerfile會看起來像這樣:
FROM golang:1.20
WORKDIR /app
COPY . .
RUN go mod download
RUN go build -o main .
CMD ["./main"]
儲存好 Dockerfile,在專案根目錄打開終端機,執行以下命令來 build Docker image:
docker build -t rss-reader .
接著,你可以用以下命令來啟動一個容器來測試你的映像檔:
docker run --rm -p 8080:8080 rss-reader
有注意到我們沒有清除掉 build cache 嗎?在 container image 的 best practice 中,其實是有建議要清掉任何在執行 container 時用不到的檔案的。
如何做到這一點?我們在剛剛的 dockerfile (有在那邊用 &&
拼接一連串 apt-get
指令的應該知道這有多麻煩) 做點手腳,但前幾年 dockerfile 支援了 multi-stage build,我們之後可以善用此功能來減少我們修改 dockerfile 的 effort。
經過今天的實作,我們應該已經有一個可運行的Docker映像檔,這個映像檔將為我們接下來的持續部署流程提供基礎。明天,我們將進一步研究如何在 GitHub Actions 中自動化這個建構過程。
有其他疑問或需要進一步的資訊,隨時與我聯繫。謝謝!