![在 Postfix 和 Dovecot 配置文件中使用 ENV 变量](https://linux22.com/image/759945/%E5%9C%A8%20Postfix%20%E5%92%8C%20Dovecot%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%B8%AD%E4%BD%BF%E7%94%A8%20ENV%20%E5%8F%98%E9%87%8F.png)
我试图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
根据导出的环境变量替换所有出现的情况。