Docker容器中同时执行Shell脚本与Nginx模板传参的问题求助
问题描述
使用Docker构建React应用并以Nginx作为生产服务器,需同时完成两项任务:
- 执行
env.sh脚本,在容器运行时动态为React应用生成环境变量配置文件env-config.js - 通过Nginx模板文件
default.conf.template,将环境变量注入Nginx配置以完成反向代理规则
但当前Dockerfile仅能执行其中一项任务,尝试多种CMD/ENTRYPOINT写法及自定义启动脚本均未解决,请求修改Dockerfile确保两项任务均可成功执行。
解决方案
核心问题在于Nginx官方镜像自带的entrypoint会自动处理/etc/nginx/templates/下的模板文件,替换环境变量后生成最终配置再启动Nginx。之前的写法要么跳过了这个官方entrypoint,要么执行顺序错误,导致两项任务无法同时完成。
修改后的Dockerfile
# React应用构建阶段 FROM node:18 AS build WORKDIR /app COPY package.json . RUN npm install COPY . . RUN npm run build # 生产环境Nginx阶段 FROM nginx:1.18.0 # 复制构建好的React静态文件到Nginx默认目录 COPY --from=build /app/build /usr/share/nginx/html # 复制Nginx模板到官方指定的模板目录 COPY ./default.conf /etc/nginx/templates/default.conf.template # 复制环境变量处理脚本和样本文件到系统可执行目录 COPY ./env.sh /usr/local/bin/env.sh COPY ./env_sample.txt /usr/local/bin/env_sample.txt RUN chmod +x /usr/local/bin/env.sh # 自定义入口:先执行React环境变量配置脚本,再调用Nginx官方入口处理模板并启动服务 ENTRYPOINT ["/bin/sh", "-c", "/usr/local/bin/env.sh && /docker-entrypoint.sh nginx -g 'daemon off;'"] EXPOSE 80
调整后的env.sh
(修正路径问题,避免与静态文件目录混淆)
#!/bin/sh # 切换到React静态文件根目录 cd /usr/share/nginx/html echo "window._env_ = {" > ./env-config.js awk -F '=' '{ print $1 ": \"" (ENVIRON[$1] ? ENVIRON[$1] : $2) "\"," }' /usr/local/bin/env_sample.txt >> ./env-config.js echo "}" >> ./env-config.js
容器运行命令(保持原命令即可)
docker run -d \ --name nginx_ui_cont \ -e 'NGINX_SERVER=192.168.7.109' \ -e ANALYTICS_API_CONT=analytics_api_cont \ -e API_CONT=api_cont \ -e 'REACT_APP_HOST_IP_ADDRESS=http://192.168.7.109' \ -p 80:80 \ nginx_ui:1
关键说明
- 执行顺序:先运行
env.sh生成React所需的环境变量配置文件,再调用Nginx官方的/docker-entrypoint.sh处理模板并启动Nginx,确保两项任务按依赖顺序完成。 - Nginx模板自动处理:Nginx官方镜像会自动扫描
/etc/nginx/templates/下的.template文件,将${变量名}替换为容器环境变量的值,生成最终配置到/etc/nginx/conf.d/。 - 路径规范:将脚本和样本文件放到
/usr/local/bin/目录,避免与React静态文件混放,同时在脚本中明确切换到静态文件目录生成配置,路径逻辑更清晰。
内容的提问来源于stack exchange,提问作者Ezhar
相关产品推荐
相关产品推荐

