如果只執行 docker-php-ext-install
會出現錯誤訊息:
PHP Startup: Unable to load dynamic library 'pdo_pgsql.so'
必須安裝 postgresql-dev
套件,完整設定為:
RUN apk add --no-cache postgresql-dev && \ docker-php-ext-install pdo pdo_pgsql pgsql
如果只執行 docker-php-ext-install
會出現錯誤訊息:
PHP Startup: Unable to load dynamic library 'pdo_pgsql.so'
必須安裝 postgresql-dev
套件,完整設定為:
RUN apk add --no-cache postgresql-dev && \ docker-php-ext-install pdo pdo_pgsql pgsql
wait-for-it 是個 shell script 撰寫的工具,會等待並檢查目標是否可以進行 TCP 連線。
例如等待 mysql 啟動:
$ wait-for-it 127.0.0.1:3306 wait-for-it: waiting 15 seconds for 127.0.0.1:3306
可以在 docker 中檢查其他 container / service 是否啟動,可以的話才繼續執行:
# wait for MySQL to initialize wait-for-it db:3306 # run DB migration php artisan migrate
追 minikube 中的 log kubectl logs s3-provider-xxxx -p
時,看到錯誤訊息:
Defaulted container "s3fuse" out of: s3fuse, init-myservice (init) /bin/sh: /docker-entrypoint.sh: Permission denied
第一,是檢查 docker-entrypoint.sh
的權限。要讓 script 可以執行,在 COPY
進 image 以後記得調整權限:
RUN ["chmod", "+x", "/docker-entrypoint.sh"]
另外,再看了一下 entrypoint 寫什麼:
#!/bin/bash set -euo pipefail set -o errexit set -o errtrace ....
第一行這樣寫有點雷。
shebang 雖然可以讓 shell 可以了解需要使用哪一個直譯器來執行 script (可以參考之前 shebang 的介紹),但是每個系統的 bash 路徑並不一定相同。有些在 /bin/bash
,有些則在 /usr/bin/bash
,當然還有其他例外。
若不確定直譯器的路徑時,可以透過 env
這個指令來協助,這個工具在個系統上的絕對路徑都是 /usr/bin/env
,env
會從 runtime environment 偵測執行檔的路徑 (上面的範例是 bash),這樣一來 script 作者就不需要為每個環境來客製化設定。
用 env
來改寫 shebang
,結果如下:
#!/usr/bin/env bash set -euo pipefail set -o errexit set -o errtrace ....
docker build 會將每個動作建立一個 image layer,好處就是相同的動作所建立 image layer 都可以重複使用,僅有新的動作會增加新的 image layer。
不過 chown 會讓 docker 將檔案判定為新的檔案,而另外新增一個 layer,導致 image size 增加。
以下是一個小實驗,其中 test.img
為 512MB 的檔案:
FROM ubuntu:20.04 # test:512-file COPY test.img /var/ # test:512-chown RUN chown www-data:www-data /var/test.img
然後針對第二、第三個指令分別 build -t
以後,透過 docker images
列出 images 和他的大小:
test 512-chown 02367f2a3158 4 seconds ago 1.15GB test 512-file 965cb380f042 41 seconds ago 610MB
經過 chown 的 test.img
被 docker 判斷為新的檔案,因此多了一個 image layer 來儲存異動,image 就整整多了 512MB,這對建立 docker image 來說儲存、傳輸成本會大很多。
目前看到比較好的解法,是使用 COPY --chown
直接指定檔案的 owner,這樣異動就會放在同一個 image layer。
之前看到 gslin 的文章「自建 Mail System 的難度」,最近跑去還債 (K 基礎教學) 才知道牽涉到的東西有那麼多 ….
由於容易的開發、部屬越發成熟,也開始有不少人開始把常用的工具和服務直接包成 image,讓自架 mail server 的門檻下降了不少。目前看到幾個感覺還不賴的 images,大家有興趣可以參考一下: