Docker部署Rails时如何将环境变量传入nginx.conf文件
实现方案
核心逻辑是不要在镜像构建阶段把域名硬编码进配置,利用Nginx容器启动阶段的环境变量替换逻辑注入动态域名,后续修改域名无需重新构建镜像,仅重启容器即可生效,步骤如下:
1. 修改Nginx配置为模板文件
将你项目中原有的nginx.conf重命名为nginx.conf.template,找到server块中写死的server_name default_server;行,替换为变量占位符,其余配置保持原样:
server { listen 80; server_name ${NGINX_DOMAIN}; # 这里替换为占位符 # 其余原有配置不变... }
2. 修改Nginx镜像的Dockerfile
调整原有nginx.Dockerfile的逻辑,安装变量替换依赖、拷贝配置模板、修改启动命令,在容器启动时自动将环境变量注入配置:
FROM nginx RUN apt-get update -qq && apt-get -y install apache2-utils gettext-base --no-install-recommends && rm -rf /var/lib/apt/lists/* ENV RAILS_ROOT /var/www/quickcard WORKDIR $RAILS_ROOT RUN mkdir log COPY public public/ # 拷贝配置模板,而非直接拷贝最终生效的配置 COPY ./nginx.conf.template /etc/nginx/conf.d/default.conf.template COPY ./multi_quickcard.key /etc/nginx/multi_quickcard.key COPY ./quickcard-ssl-test.pem /etc/nginx/quickcard-ssl-test.pem EXPOSE 80 443 # 启动时先替换指定变量生成最终配置,再启动Nginx CMD ["/bin/bash", "-c", "envsubst '$NGINX_DOMAIN' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"]
注意:
envsubst '$NGINX_DOMAIN'的作用是仅替换我们自定义的域名变量,不会改动Nginx配置中自带的$http_host、$proxy_add_x_forwarded_for等内置变量,避免配置失效。
3. 在docker-compose中传入动态域名
修改docker-compose.yml中的nginx服务配置,新增环境变量段传入域名值:
nginx: build: context: . dockerfile: ./nginx.Dockerfile volumes: - ./log-nginx:/var/log/nginx/ restart: always ports: - 80:80 - 443:443 # 新增环境变量配置 environment: - NGINX_DOMAIN=你的实际业务域名,例如quickcard.demo.com
如果需要更灵活的配置,可以在项目根目录新建.env文件,写入NGINX_DOMAIN=你的域名,docker-compose会自动读取该文件中的变量,后续更换域名仅需修改.env文件,执行docker-compose up -d nginx重启Nginx容器即可生效,无需重新构建镜像。
4. 生效操作
因为修改了Nginx的Dockerfile,第一次执行需要重新构建Nginx镜像:
docker-compose build nginx docker-compose up -d
不推荐方案说明
如果执意要在build阶段传入域名(灵活性极差,更换域名必须重新构建镜像),可以通过Dockerfile的ARG指令配合docker-compose build阶段的args参数传值,但不符合容器“镜像与配置分离”的最佳实践,不建议使用。
内容的提问来源于stack exchange,提问作者Saad Saddique
相关产品推荐
相关产品推荐

