在開始深入編寫我們的 Dockerfile 之前,我們先來分析 odoo 官方提供的三種安裝方式,了解它們的運作機制:
首先,我們來看從原始碼安裝的方法。以下是官方提供的安裝步驟:
git clone https://github.com/odoo/odoo.git
sudo apt install postgresql postgresql-client
sudo -u postgres createuser -d -R -S $USER
createdb $USER
cd odoo # CommunityPath
sudo ./setup/debinstall.sh
sudo npm install -g rtlcss # 若需要支持右至左語言(如阿拉伯語或希伯來語)
可以看到,大部分的步驟都相當淺顯易懂。只有倒數第二行 sudo ./setup/debinstall.sh
需要深入探討。
這個指令執行了一個腳本 debinstall.sh
,我們來看看它的主要內容:
定位控制檔 debian/control
:
script_path=$(realpath "$0")
script_dir=$(dirname "$script_path")
control_path=$(realpath "$script_dir/../debian/control")
這段程式碼用於找到控制檔的位置,首先取得當前腳本的實際路徑,然後找到其目錄,最後定位到 ../debian/control
。
提取依賴套件列表:
sed -n '/^Depends:/,/^[A-Z]/p' "$control_path" \
| awk '/^ [a-z]/ { gsub(/,/,"") ; gsub(" ", "") ; print $NF }' | sort -u \
| DEBIAN_FRONTEND=noninteractive xargs $cmd
解釋:
sed
指令從 Depends:
開始,到下一個以大寫字母開頭的行,提取所有內容,這些內容包含了所有的依賴套件。awk
指令過濾並格式化套件名稱,移除逗號和空格,取得每個套件的名稱。sort -u
將套件名稱排序並移除重複項。xargs $cmd
將套件名稱傳遞給之前定義的安裝命令,執行安裝。安裝依賴套件:
如果不使用 -l
選項,腳本會使用以下命令來安裝所有的依賴套件:
apt-get install -y --no-install-recommends [套件列表]
接下來,我們看看使用套件管理器直接安裝 odoo。官方提供的步驟如下:
sudo apt install postgresql -y
wget -q -O - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor -o /usr/share/keyrings/odoo-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/17.0/nightly/deb/ ./' | sudo tee /etc/apt/sources.list.d/odoo.list
sudo apt-get update && sudo apt-get install odoo
解釋:
最後,我們來看使用官方提供的 Docker 映像檔。官方的指令如下:
docker run -d -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo -e POSTGRES_DB=postgres --name db postgres:15
docker run -p 8069:8069 --name odoo --link db:db -t odoo
分析 Dockerfile:
官方的 Dockerfile 主要執行以下步驟:
rtlcss
,以支持從右至左的語言,如阿拉伯語或希伯來語。apt
進行安裝。我們的目標是盡可能利用現有的資源,減少自行處理的部分,降低採到問題而要 debug 的機會。因此,我們計劃在官方提供的第三種方法——使用官方 Docker 映像檔的基礎上進行調整。
由於我們需要進行開發,並可能安裝自訂的 Python 套件和 odoo 模組,如果直接使用官方的 Docker 映像檔,會面臨以下問題:
依賴套件的管理複雜性:
官方映像檔中的 odoo 及其依賴套件是透過套件管理器安裝的,而我們的模組可能需要額外的 Python 套件。這會導致依賴套件分散在不同的地方,不利於統一管理。
缺乏彈性:
官方映像檔每次都使用最新的 Odoo 版本,可能導致開發基礎不穩定。此外,不易修改啟動流程,無法滿足特定的開發和佈署需求。
因此,我們決定基於官方的 Dockerfile,進行以下調整:
從套件安裝改為從原始碼安裝:
這樣可以確保我們對 odoo 有完全的控制權,方便進行開發和除錯。
統一依賴套件管理:
所有的 Python 依賴套件(無論是 odoo 的還是自訂模組的)都在 Dockerfile 中統一管理,避免分散在系統套件和 Python 套件之間。
客製化啟動流程:
透過自訂的 entrypoint
,可以修改 Odoo 的啟動流程,實現更多功能,例如自動化初始,節省開發時間。