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
相关产品推荐
相关产品推荐

