Docker

優化加速 docker build 的秘訣 —— 使用 Cache mounts

現代開發應用(application)或多或少都會使用到第三方套件,不僅減少自行開發的成本,也加速開發應用的速度,所以各種程式語言都會有所謂的 package manager, 幫助開發者安裝/管理各種第三方套件與套件相依性,例如 npm, yarn, pip, go mod 等等,甚至作業系統也有 package manager 例如著名的 APT(Advanced Packaging Tool), Homebrew 等等。

但是隨著第三方套件越用越多,每次重新編譯(build) Docker 映像檔(image)的時間也會越來越長,因為每次重新 build docker image 都要花費不少時間重新下載並安裝第三方套件⋯⋯。

針對這個問題, Docker 官方文件有提到可以使用 Cache mounts 優化 build 的速度。

一起認識什麼是 Cache mounts 吧!

Posted on  Nov 26, 2023  in  Docker  by  Amo Chen  ‐ 3 min read

用 Docker 編譯並匯出執行檔 (compile & export)

最近在 macOS 用 Go 語言開發專案,不過遇到一些 Cross-Compiling 無法運作的問題,礙於時間壓力只得想辦法避開 Cross-Compiling 的問題,最直覺的方式就是直接在最終需要部署的作業系統中編譯,所以決定暫時用相同作業系統版本的 Docker container 以進行編譯,再將 Docker image 內最終編譯完成的執行檔匯出即可。

Docker 官方也提供文件指引如何匯出檔案,但是過程可能會遇到讀寫的問題,所以本文重新以比較簡單的方式介紹如何匯出 Docker image 內的檔案。

Posted on  Jun 16, 2023  in  Docker  by  Amo Chen  ‐ 2 min read

優化 Python Docker Image Size - 從 multi-stage builds 到 distroless

Docker multi-stage builds 教學 一文介紹以 Golang 作為範例,示範如何用 Docker multi-stage builds 的功能,優化編譯 Docker image 的過程,以減少 Docker Image 的 size 。

Multi-stage builds 並不局限於 Golang 這類的編譯(compiled)語言才能使用,腳本(script)語言也能夠運用類似的技巧降低 Docker image size, 例如 Javascript, Python 等開發生態系也都能夠使用。

只是腳本語言需透過直譯器(interpreter)執行的天性,因此其 Docker image 終究難以像 Golang 這類編譯語言所產生的 image 來得小,但這並不代表 Python, Javascript 這類的 Docker image 並不值得使用 multi-stage builds, 優化 Docker image size 仍可以為部署(deployment)速度帶來優勢,同時也能減少網路傳輸所需付出的費用成本。

本文的 multi-stage builds 以 Python 範例出發,一路介紹到如何使用 Google 所提供 distroless 進一步優化 Docker image size 與安全性。

Posted on  Jan 6, 2023  in  Docker , Python 程式設計 - 高階  by  Amo Chen  ‐ 5 min read

Docker volumes 教學 - 從不熟到略懂

談到 Docker 容器的資料儲存(storage)問題,基本直覺就是透過掛載 Volumes, 不過 Docker 的 Volumes 其實有 3 種不同類型(types):

  1. Bind mount
  2. Volume
  3. tmpfs mount

大家常用的 -v <Host 路徑>:<Container 路徑> 參數其實就是使用 bind mount, 例如以下指令:

$ docker run -it -v /home/user:/data debian /bin/bash

簡而言之,使用 bind mount 的 volume 其實就是透過 host machine 的檔案系統(filesystem)提供容器儲存的能力。

雖然不清楚 volume 的類型,並不會對日常使用上造成任何問題,不過理解其差異仍有其必要,因爲這些差異很可能會在 production 環境上產生重大影響。

Posted on  Apr 1, 2022  in  Docker  by  Amo Chen  ‐ 5 min read

Docker CMD 與 ENTRYPOINT 說明詳解

寫 Dockerfile 時,經常搞不清楚 CMDENTRYPOINT 的差異,雖然兩者用途相當雷同,但還是特別查閱了一下 Docker 的官方文件,了解兩者的用途以及差別,並且透過實際的範例驗證後,記錄成本文。

Posted on  Dec 28, 2021  in  Docker  by  Amo Chen  ‐ 5 min read

Docker multi-stage builds 教學

Docker 映像檔(image)大小在 production 環境中也是相當重要的一環。

如果 Docker 映像檔太大,不僅佔用傳輸頻寬,也會拉長部署(deployment)的時間,因此如何優化 Docker 映像檔案大小是一門重要課題。

優化 Docker 映像檔大小有若干種方法,其中一種為 multi-stage build, 不過 Docker 官方文件所提供的 multi-stage builds 範例卻無法正常運作,本篇將修正該範例並實際體驗 multi-stage builds 的效果。

Last updated on  Dec 30, 2022  in  Docker  by  Amo Chen  ‐ 3 min read

Docker 環境變數使用筆記

環境變數(Environment variable)是開發時常見用來控制程式行為的方法之一。

近年隨著 Docker 被普遍運用在開發環境之中,如何方便地在 Docker 中使用環境變數就變成必學的課題之一。

本篇介紹幾種 Docker 與 Docker compose 中設定環境變數的方法。

Posted on  Jun 19, 2020  in  Docker  by  Amo Chen  ‐ 2 min read

wait-for-it.sh - 使用 Docker Compose depends_on 的必備 bash script

撰寫 docker-compose.yaml 經常會遇到要使用 depends_on 的情況,確保某些特定的服務可以先啟動,例如 Web Application 經常要 depends_on 資料庫(database)服務。

但是 depends_on 指確保該 container 狀態會進到 running ,而非確保 container 內的服務會完整啟動結束。

However, for startup Compose does not wait until a container is “ready” (whatever that means for your particular application) - only until it’s running.

以 Web Application 與資料庫服務為例,在這種情況下,就會遇到資料庫服務的 container 已經進到 running ,但其實資料庫的程序(process)還沒完全啟動,進而導致 Web Application 服務連不到資料庫而失敗。

遇到這問題,建議可以使用 wait-for-it.sh 來解決!

Posted on  Nov 1, 2019  in  Docker  by  Amo Chen  ‐ 2 min read