好的,我正在为 apache 构建一个 docker 镜像。我想允许用户使用环境变量指定自定义 apache 配置。
总结
问题可以简化为:如何使用环境变量来打印部分配置(而不仅仅是指令值)。像这样:
<IfDefine HasCustomVHostConfig>
${APACHE_CUSTOM_VHOST_CONFIG}
</IfDefine>
目前,环境变量的值似乎被打印出来,但 apache 忽略了最多的指令。
长话短说。
我们有 1) docker 入口点 2) apache 配置 3) 环境变量,其中包含该配置的一部分(可以由启动 docker 镜像的用户进行修改)。
1. Docker 入口点# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid
# Read apache2 env vars
source /etc/apache2/envvars
# Build apachectl options array
APACHE_OPTS=(-DFOREGROUND)
# If custom config has been set, add an option flag we will check later in config
if [[ -v APACHE_CUSTOM_VHOST_CONFIG ]]; then
APACHE_OPTS+=(-DHasCustomVHostConfig)
fi
# Run apache2 in foreground
/usr/sbin/apachectl "${APACHE_OPTS[@]}"
2. Apache 虚拟主机配置
<VirtualHost _default_:80>
ServerSignature Off
ErrorLog ${APACHE_LOG_DIR}/000-default-error.log
CustomLog ${APACHE_LOG_DIR}/000-default-access.log combined
DocumentRoot ${APACHE_DOCUMENT_ROOT}
<IfDefine HasCustomVHostConfig>
${APACHE_CUSTOM_VHOST_CONFIG}
</IfDefine>
<Directory ${APACHE_DOCUMENT_ROOT}>
Options FollowSymLinks
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
注意,此配置有一个IfDefine
语句,它将检查我们在入口点设置的选项标志,如果设置了,则将打印环境变量。
测试
- 如果我将环境变量设置为不正确的配置,我将在 apache 启动期间清楚地看到错误,这意味着所有标志和 IfDefine 语句都在起作用。
- 如果我使用 mod_redirect 将环境变量设置为简单重定向,它就会起作用,这意味着 apache 能够应用用环境变量打印的配置。
- 如果我将环境变量设置为使用 mod_rewrite 的更复杂的重定向,或者使用 mod_proxy 和 mod_proxy_http 的代理配置 - apache 将忽略它。如果将相同的配置直接添加到配置中,apache 将拾取并应用它。
我在这里遗漏了什么?