文章

談 docker compose 的 depends_on 設定怎麼使用

在使用 docker compose 架設開發環境時,會遇到所謂的服務相依性問題(service dependencies), 舉個簡單的例子,通常資料庫的容器(container)ㄧ定要先正常啟動,後端 API server 的容器才能接著啟動,因為 API server 可能在啟動時需要與資料庫連線建立 connection pool 之後,才會提供 API 服務,否則就會發生錯誤並退出執行,導致容器啟動失敗。

在這個情況下, API server 容器依賴資料庫容器的正常運作,這就是服務相依性。如果沒有理解服務相依性的問題,那麼在使用 docker compose 的時候,將會很容易遇到時而啟動成功,時而啟動失敗的問題,因為有時相依的服務會剛好準時或提早起動成功,有時則還沒準備好。

為此, docker compose 也有提供解決服務相依性的設定,那就是 depends_on 設定。

本文將教導如何使用 depends_on 設定。

Posted on  Dec 14, 2023  in  Docker  by  Amo Chen  ‐ 5 min read

Go 用 -ldflags -X 參數在編譯時自動設定程式碼內的字串變數值

為了方便除錯,通常我們會在程式裡留下一些方便除錯的資訊,包含是哪個 commit 或者哪個系統編譯、哪個版本號等等⋯⋯。

你是手動更改這些資訊的嗎?

本文將透過實際範例教導如何自動化帶入這些資訊到 Go 的執行檔中,讓你徹底解脫手動之苦,效率 up up!

Posted on  Dec 7, 2023  in  Go 程式設計 - 中階  by  Amo Chen  ‐ 4 min read

優化加速 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

超實用 parallel 指令教學

江湖闖久了,遇到資料處理相關的工作是常有的事,譬如為一堆 jpg 圖檔產生縮圖(thumbnail),或者把一堆 TSV 檔轉換成 CSV 格式,又或者把一堆資料夾分別用 tar 指令壓縮起來,諸如此類的。

針對這些情況,我個人很常用 awk 指令(詳見 awk 指令教學)產生所需要的指令,再丟到 shell 逐一執行,例如:

$ ls -l *.jpg | awk '{ print "tar -czvf "$9".tar.gz "$9}' | sh

上述指令中 ls -l *.jpg | awk '{ print "tar -czvf "$9".tar.gz "$9}' 的部分是為每 1 個 jpg 檔案產生 1 個對應的壓縮指令的字串,例如當前資料夾下有 a.jpgb.jpg 2 個檔案的話,就會產生下列 2 行字串:

tar -czvf a.jpg.tar.gz a.jpg
tar -czvf b.jpg.tar.gz b.jpg

上述字串再以 | sh 交給 shell 執行。

不過這種用法的缺點就是指令會逐一執行,如果有 300 個檔案,每個處理要 1 秒,那麼就得等待 300 秒才能完成工作。

如果能夠將這些工作平行處理,將可以大大減少執行時間,這就是本文要介紹的 parallel 指令的最大用途,讓人能在 shell 中平行處理多個指令,增加執行速度。

Posted on  Nov 23, 2023  in  Unix-like 命令列教學  by  Amo Chen  ‐ 8 min read

如何在 macOS 上為 iOS 裝置裡的瀏覽器網頁除錯(Debugging websites in Chrome on iOS)

隨著各種手持智慧型裝置的盛行,一個網頁可能會在不同尺寸上的螢幕呈現,因此網頁設計勢必要考慮響應式設計(responsive design),如不考慮響應式設計不僅容易造成使用者困擾之外,也可能會影響 SEO 分數,例如 Google 對有考量 mobile-first 設計的網站有加分。

雖然可以在瀏覽器的開發者工具調整螢幕尺寸,藉此查看網頁在不同裝置、螢幕尺寸的表現,不過最好還是實際在手持裝置內測試過會比較安心,因為我們無法保證手持裝置內的瀏覽器實作方式會跟其他平台一樣,這些差異就可能造成網頁的呈現不符預期。

但是要為手持裝置裡的瀏覽器網頁除錯,需要做一些設定才行,本文記錄如何在 macOS (例如 MacBook )上為 iOS 裝置(例如 iPhone ) 裡的瀏覽器網頁除錯(debugging)的設定過程。

Posted on  Nov 19, 2023  by  Amo Chen  ‐ 3 min read

以 bfg 指令清除含密碼、金鑰的 Git commits

眾所周知,版本控制系統會將所有的變更都存起來,因此我們能夠隨意回溯到任一版本,這些變更也包含你不小心提交存有機密資料的檔案,或是帳號密碼等字串。

對於版本控制不熟的使用者來說,可能會以為再提交 1 個已經刪除機敏資料的 commit 就安全了,實則不然,有心人士依然可以透過回溯版本或者在 .git 版本控制系統的資料夾內用工具撈出各種疑似帳號密碼的字串,進而入侵你的系統。

實際上也確實有數起資安事故是由於版本控制系統中含有帳號密碼等資訊所造成。

所以要從清理機敏資料,一定要連版本控制系統內的變動紀錄都要一併清理才安全!

本文將教導如何以 bfg 指令安全地清除含有密碼、金鑰等機敏資料的 commits 。

Posted on  Nov 8, 2023  in  Git 版本控制  by  Amo Chen  ‐ 3 min read

Python 細說 type() 與 Metaclass

Python 的類別定義有個神奇的參數,稱為 metaclass , 範例如下:

class Meta(type):
    pass

class A(metaclass=Meta):
    pass

這個參數不是繼承(inheritance), 但是它到底具體是做什麼的呢?就讓本文娓娓道來吧!

Posted on  Oct 26, 2023  in  Python 程式設計 - 高階  by  Amo Chen  ‐ 4 min read