iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Odoo

Odoo 部署策略系列 第 4

從官方 Dockerfile 開始調整:以原始碼安裝取代套件安裝

  • 分享至 

  • xImage
  •  

在開始調整我們的 Dockerfile 之前,先附上官方的 Dockerfile 網址供大家參考:odoo/docker/17.0/Dockerfile


在一切重要的修改開始前,測試安裝官方的 Odoo Docker 時,我就發現了一個問題:這個 Docker 的安裝速度非常慢,對於測試調整來說很浪費時間。所以,突然的工商時間就出現了!

推薦大家改用 海豹同學 大力建置的 TWDS 台灣軟體鏡像站(Mirror):https://mirror.twds.com.tw/

大意就是:

總之台灣的 Mirror 現況就是每個都要死不活的。本來絕大多數流量都是靠 NCHC 跟 Hinet 在撐,但 NCHC 目前感覺也是疏於管理,也有一部分的同步有點問題。唯一運作比較正常的 Hinet 在七月收掉了。所以只好找幾個社群比較活躍的人類弄一個新的 Mirror。

詳情請見簡報:你各位的 Open Source Project 建立在多脆弱的 Infrastructure 上?
還有附上贊助連結
聲明:本人/本撰寫相關團體(以下簡稱我)目前與上述贊助連結無任何利益關係,且預計未來 72 小時內不會多跳這個坑。

所以,基於官方的 Dockerfile,第一個改動就是新增了以下內容:

# 更新套件列表,安裝、更新 CA 證書,並添加新的 Mirror
RUN apt-get update && apt-get install -y ca-certificates && \
    update-ca-certificates && \
    sed -i '1ideb https://mirror.twds.com.tw/ubuntu/ jammy main restricted universe multiverse' /etc/apt/sources.list && \
    sed -i '1ideb https://mirror.twds.com.tw/ubuntu/ jammy-updates main restricted universe multiverse' /etc/apt/sources.list && \
    sed -i '1ideb https://mirror.twds.com.tw/ubuntu/ jammy-backports main restricted universe multiverse' /etc/apt/sources.list && \
    sed -i '1ideb https://mirror.twds.com.tw/ubuntu/ jammy-security main restricted universe multiverse' /etc/apt/sources.list

進入正題,基於官方的 Dockerfile,我們開始進行調整。首先,我們觀察到 Dockerfile 可以分成兩個大塊:

  1. Base stage:安裝依賴套件
  2. Final stage:設定 Odoo

這樣的劃分有助於利用 Docker 的快取機制。Docker 在建置映像檔時,會從上到下執行每個指令,並在每個指令之間建立快取層。如果我們對某個步驟進行了更改,Docker 會從該步驟開始重新建置後續的所有步驟。因此,將變動較少的部分放在前面,變動較多的部分放在後面,可以最大化地利用快取,減少重複建置的時間。

接下來,官方安裝 wkhtmltoxpostgresql-clientrtlcss 的步驟,我們都保留不動。為了讓我們的環境盡可能與官方版本相同,這樣如果我們遇到問題,全球大部分的使用者也可能會遇到相同的問題,有助於我們尋找解決方案。

到了依賴套件的最後一步,因為我們要將 Odoo 的安裝方式從套件安裝改為原始碼安裝,所以在 Base stage 的最後,我們需要手動安裝 Odoo 所需的依賴套件。

原本官方給的從原始碼安裝的方法是:

sudo ./setup/debinstall.sh

但這種方法有兩個問題:

  1. 無法統一依賴套件的管理:我們的模組可能也需要其他的 Python 套件,如果使用這種方式安裝,依賴套件會分散在不同的地方,增加管理困難。

  2. 可能會遇到一些問題(?):我發現從這個地方安裝可能會有點問題,這部分的分析會在下一篇說明。

所以,我們的結論是,直接在 Dockerfile 中明確指定要安裝的依賴套件。直接先貼上現在的做法:

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        python3-babel \
        python3-chardet \
        python3-cryptography \
        python3-dateutil \
        python3-decorator \
        python3-docutils \
        python3-geoip2 \
        python3-gevent \
        python3-greenlet \
        python3-idna \
        python3-jinja2 \
        python3-libsass \
        python3-lxml \
        python3-markupsafe \
        python3-num2words \
        python3-ofxparse \
        python3-openssl \
        python3-passlib \
        python3-pil \
        python3-polib \
        python3-psutil \
        python3-psycopg2 \
        python3-pydot \
        python3-pypdf2 \
        python3-qrcode \
        python3-reportlab \
        python3-requests \
        python3-rjsmin \
        python3-serial \
        python3-stdnum \
        python3-tz \
        python3-urllib3 \
        python3-usb \
        python3-vobject \
        python3-werkzeug \
        python3-xlrd \
        python3-xlsxwriter \
        python3-xlwt \
        python3-zeep \
        adduser \
        fonts-dejavu-core \
        fonts-freefont-ttf \
        fonts-freefont-otf \
        fonts-noto-core \
        fonts-inconsolata \
        fonts-font-awesome \
        fonts-roboto-unhinted \
        gsfonts \
        libjs-underscore \
        lsb-base \
        postgresql-client \
        python3-freezegun \
        python3-renderpm \
    #  python3-lxml-html-clean \
    && apt-get clean && \
    rm -rf /var/lib/apt/lists/*

接下來的 Dockerfile 就是我們的第二大段:Final stage:設定 Odoo

這部分其實相對簡單。我們參考官方的原始碼安裝步驟,將必要的檔案和資料夾複製到我們想要的位置,盡量貼近 Odoo 官方或 Docker 官方常見的檔案位置。例如,我們將 Odoo 原始碼放在 /usr/src/app/odoo,自訂的 addons 放在 /opt/odoo/addons

以下是相關的 Dockerfile 指令:

# 設定預設的設定檔案路徑
ENV ODOO_RC /etc/odoo/odoo.conf

# 複製本地的 odoo 原始碼和 addons 到映像檔中
# 複製 odoo 設定檔案
COPY ./odoo /usr/src/app/odoo
COPY ./addons /opt/odoo/addons
COPY ./odoo.conf /etc/odoo/

WORKDIR /usr/src/app/odoo

最後就剩下複製 entrypoint.sh, check-db-status.py,設定好 ENTRYPOINT,然後執行 odoo。ENTRYPOINT 指令用於設定容器啟動時執行的命令或腳本,使得容器可以被當作可執行檔來使用,並且可以接收 CMD 或執行時提供的參數。在我們的情境中,entrypoint.sh 會在啟動 odoo 之前執行一些必要的準備工作,例如檢查資料庫是否已經就緒等。而 entrypoint.sh 的詳細檔案內容 留待下下篇處理

COPY ./check-db-status.py /usr/local/bin/
COPY ./entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

上一篇
分析 odoo 官方安裝方法:從原始碼、套件管理或 Docker 安裝
下一篇
odoo 依賴套件詳解:打造穩定的 Docker 環境
系列文
Odoo 部署策略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言