Linux

在 Postfix 和 Dovecot 配置文件中使用 ENV 變數

  • April 15, 2022

我正在嘗試對我的郵件伺服器進行dockerize處理,但在我應該如何在 Postfix 和 Dovecot 配置文件中使用環境變數方面遇到了一些麻煩(我正在使用通過 apt for ubuntu:18.04 獲得的最新軟體包)。

我已經在 Dovecot.conf (1) 和 main.cf (2) 中導入了我想使用的變數,但老實說,我現在不知道我必須遵循哪種語法才能使用它們。

(1) Dovecot.conf

import_environment= MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD, DOMAIN_NAME, CERTS_DIR, DOVECOT_SASL_PORT

(2) Postfix的main.cf

import_environment= MYSQL_DATABASE, MYSQL_USER, {MYSQL_PASSWORD}, DOMAIN_NAME, CERTS_DIR, DOVECOT_SASL_PORT

根據Dovecot 的文件,我應該env:MYSQL_DATABASE在我想引用我的數據庫時使用,env:DOMAIN_NAME每當我想引用我的域名時,等等。但是,根據2019 年的郵件列表,使用者將其 ENV 變數稱為%{env:EXAMPLE_VAR}. 哪種方法是正確的?它們是否同樣有效?

另一方面,關於 Postfix,我找不到與引用環境變數時必須使用什麼語法相關的任何內容,如果有人能告訴我應該如何進行,我將不勝感激。

非常感謝!

我發現 Dovecot 未能在.conf文件中擴展環境變數,例如10-master.conf. 由於除了聲明之外我沒有找到關於後綴的任何內容,因此import_environment我最終在$MY_VAR所有地方使用語法並傳遞我的 conf 文件以envsubst根據導出的 env 變數替換所有出現。

你是對的,dovecot 允許使用環境作為源進行變數擴展。%{env:FOR_WHAT_ITS_WORTH}正確的語法。但請記住,dovecot 有兩種類型的配置文件:以 結尾的“普通”配置文件.conf和以 結尾的配置文件.conf.ext,通常用於外部連接,例如從 LDAP 或某些 SQL DBMS 獲取使用者數據庫。後者根本提供變數擴展,因此您需要採用不同的方法(更多內容見下文)。

說到後綴,我知道沒有標準機制,文件也沒有提到任何關於它的內容。

有一個解決方案,您可能已經猜到了,它涉及一些工作,但適用於您想要容器化的任何東西。我假設您正在使用一些docker-entrypoint.sh腳本在您的容器內啟動 postfix 和 dovecot,並預先檢查是否已完成首次設置。如果沒有,它會執行第一次設置。您甚至可以在每次容器啟動時無條件地執行此設置,以根據環境中的內容更改配置。

假設您已經在容器外準備了配置文件,並通過 docker 文件中看起來像COPY config /root/config.tpl. 在這些配置文件中是標準的 shell 變數,例如bind_dn = ${MY_BIND_DN} **,**您已經轉義了配置模板中的所有$\字元。您現在可以做的只是通過 eval 過濾模板,然後將輸出放在它所屬的位置。請參閱此範例以進行說明。

for CONFIG_TEMPLATE in /root/config.tpl ; do
 cat ${CONFIG_TEMPLATE} | eval "echo \"$(cat ${CONFIG_TEMPLATE})\"" > /etc/dovecot/conf.d/${CONFIG_TEMPLATE}
done

這差不多,我知道。儘管如此,除非您的配置文件中有太多需要轉義的內容,否則它工作得很好,並且它允許您配置幾乎所有基於容器從環境啟動的配置文件。

引用自:https://serverfault.com/questions/1042635