在 Postfix 和 Dovecot 配置文件中使用 ENV 变量

在 Postfix 和 Dovecot 配置文件中使用 ENV 变量

我试图docker 化我的邮件服务器,我遇到了一些关于如何在 Postfix 和 Dovecot 配置文件中使用环境变量的麻烦(我正在使用通过 apt for ubuntu:18.04 提供的最新软件包)。

我已经在 Dovecot.conf (1) 和 main.cf (2) 中导入了我想使用的变量,但老实说,我现在不知道必须遵循哪种语法才能使用这些变量。

(1)Dovecot配置文件

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

(2)Postfix 的主配置文件

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,我找不到任何与引用环境变量时必须使用什么语法相关的内容,如果有人能告诉我该如何进行,我将不胜感激。

多谢!

答案1

你是对的,dovecot 允许使用环境作为源进行变量扩展%{env:FOR_WHAT_ITS_WORTH}正确的语法。请记住,dovecot 有两种类型的配置文件:以 结尾的“普通”配置文件.conf和以 结尾的配置文件.conf.ext,后者通常用于外部连接,例如从 LDAP 或某些 SQL DBMS 获取用户数据库。后者不是提供变量扩展完全没有,所以你需要采取不同的方法(更多内容见下文)。

至于后缀,据我所知,没有标准机制,而且文档没有提及任何有关此事的事情。

对此有一个解决方案,您可能已经猜到了,它需要一些工作,但适用于您想要容器化的任何内容。我假设您正在使用一些docker-entrypoint.sh脚本在容器内启动 postfix 和 dovecot,并且会事先检查是否已完成首次设置。如果没有,它将运行首次设置。您甚至可以在每次启动容器时无条件地运行此设置,以根据环境中的内容更改配置。

假设你已经在容器外准备好了配置文件,并通过类似这样的 docker file 中的某些内容将其复制过来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

我知道,差不多就是这样。不过,除非配置文件中有太多东西需要转义,否则它工作得很好,并且它允许您配置几乎所有基于从环境中启动容器的配置文件。

答案2

我想具体扩展有关 Postfix 的答案,特别是因为这是“Postfix import_environment”的唯一顶级搜索结果,并且不属于官方文档。

文档听起来像这样应该可以工作,但永远也不会——没有神奇的语法。阅读代码后,很明显该功能旨在导入环境变量以通过管道/传递给其他进程。它们永远不会作为配置的一部分展开。甚至还有一条关于它的评论postconf.c:“我们不从 main.cf 中提取 import_environment,因为……”并继续解释尝试这样做的问题。

因此,希望我能够帮您节省一些时间,避免您陷入我所犯的错误:此功能并没有像您想象的那样发挥作用。在 Postfix 配置文件中直接使用环境变量是不可能的。

答案3

我发现 Dovecot 无法扩展.conf诸如 之类的文件内的环境变量10-master.conf。由于除了声明之外我没有找到有关 postfix 的任何内容import_environment,我最终$MY_VAR在各处使用语法并将我的 conf 文件传递​​给 以envsubst根据导出的环境变量替换所有出现的情况。

相关内容