我正在尝试对我的邮件服务器进行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 允许使用环境作为源进行变量扩展。
%{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 过滤模板,然后将输出放在它所属的位置。请参阅此示例以进行说明。这差不多,我知道。尽管如此,除非您的配置文件中有太多需要转义的内容,否则它工作得很好,并且它允许您配置几乎所有基于容器从环境启动的配置文件。
我想具体扩展关于 Postfix 的答案,特别是因为这是唯一不属于官方文档的“Postfix import_environment”的热门搜索结果。
文档让它听起来应该可以工作,但它永远不会 - 没有神奇的语法。通读代码,很明显该功能旨在导入环境变量以通过管道/传递给其他进程。它们永远不会作为配置的一部分进行扩展。甚至有一条关于它的评论
postconf.c
:“我们不会从 main.cf 中提取 import_environment,因为...”并继续解释尝试这样做的问题。因此,希望我能节省您一些时间,以免您陷入我所做的兔子洞:此功能不会像您认为的那样做。直接在 Postfix 配置文件中使用环境变量是不可能的。
我发现 Dovecot 未能在
.conf
文件中扩展环境变量,例如10-master.conf
. 由于除了声明之外我没有找到关于后缀的任何内容,因此import_environment
我最终在$MY_VAR
所有地方使用语法并传递我的 conf 文件以envsubst
根据导出的 env 变量替换所有出现。