You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose中.env变量无法填充至nginx.conf.template问题

解决Nginx模板变量未替换的问题

核心原因

你的shell脚本能正常读取环境变量,但Nginx模板文件里的变量没被替换,本质是容器启动时没执行模板替换逻辑,或者替换过程没正确拿到环境变量。

具体解决步骤

1. 修改nginx子目录下的myshellscript.sh,添加模板替换逻辑

用Nginx镜像自带的envsubst工具替换模板变量,注意要明确指定需要替换的自定义变量,避免误替换Nginx原生的$变量(比如$host):

#!/bin/sh
# 替换模板中的指定变量,生成真实的nginx配置文件
envsubst '$DOCKER_DOMAIN_NAMES $DOCKER_SERVER_NAMES' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
# 启动Nginx前台进程
nginx -g 'daemon off;'

2. 调整nginx子目录的Dockerfile,确保脚本被执行

修改nginx/Dockerfile,让容器启动时自动运行替换脚本:

FROM nginx:alpine
# 复制模板和脚本到容器对应目录
COPY nginx.conf.template /etc/nginx/nginx.conf.template
COPY myshellscript.sh /usr/local/bin/myshellscript.sh
# 给脚本添加执行权限
RUN chmod +x /usr/local/bin/myshellscript.sh
# 设置容器启动命令为执行脚本
CMD ["myshellscript.sh"]

3. 确认docker-compose.yml的环境变量传递配置

确保根目录的docker-compose.yml把.env里的变量正确传递给nginx服务:

version: '3.8'
services:
  nginx:
    build: ./nginx
    env_file:
      - .env  # 加载根目录的.env文件
    environment:
      - DOCKER_DOMAIN_NAMES=${DOCKER_DOMAIN_NAMES}
      - DOCKER_SERVER_NAMES=${DOCKER_SERVER_NAMES}
    ports:
      - "80:80"

4. 验证替换效果

重新构建并启动容器:

docker-compose down && docker-compose up --build

进入容器查看生成的配置文件:

docker exec -it <你的nginx容器名> cat /etc/nginx/nginx.conf

此时应该能看到模板里的变量已经被替换为.env中的实际值。

额外注意事项

  • 如果模板里有Nginx原生的$变量(比如$request_uri),必须在envsubst后明确列出所有需要替换的自定义变量,不能用envsubst '$*',否则会把Nginx的原生变量替换为空。
  • 确保脚本里的模板路径和生成的配置文件路径正确,要覆盖Nginx默认读取的配置文件路径,或者在启动Nginx时指定配置文件位置。

内容的提问来源于stack exchange,提问作者Pachuca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:13:16