OpenShift中Nginx非特权用户下env.js生成权限问题求助
解决OpenShift非root环境下生成env.js的问题
方案1:生成到/tmp并通过nginx配置映射
nginx-unprivileged镜像默认允许nginx用户读写/tmp目录,可将env.js生成到该目录,再通过nginx配置映射让前端访问:
准备env.js模板(示例命名为
env.template.js):window.env = { API_URL: "${API_URL}", APP_NAME: "${APP_NAME}" };编写启动脚本(
start-nginx.sh):#!/bin/sh # 从模板生成env.js到/tmp目录 envsubst < /usr/share/nginx/html/static/env.template.js > /tmp/env.js # 修改nginx配置,添加静态文件映射规则 cat >> /etc/nginx/conf.d/default.conf << EOF location /static/env.js { alias /tmp/env.js; } EOF # 启动nginx服务 nginx -g "daemon off;"OpenShift部署配置:
- 将模板文件和启动脚本打包为ConfigMap,挂载到容器内对应路径(比如
/etc/nginx/custom/) - 给启动脚本添加执行权限:可通过init容器执行
chmod +x /etc/nginx/custom/start-nginx.sh,或在ConfigMap中直接设置文件权限(OpenShift 4.10+支持) - 将容器启动命令改为
/etc/nginx/custom/start-nginx.sh
- 将模板文件和启动脚本打包为ConfigMap,挂载到容器内对应路径(比如
方案2:用init容器修改静态目录权限
若必须将env.js放在/usr/share/nginx/html/static下,可借助init容器临时以root权限修改目录权限:
编写权限修复脚本(
fix-perms.sh):#!/bin/sh # 给static目录赋予nginx用户读写权限(nginx-unprivileged的UID/GID为101) chown -R 101:101 /usr/share/nginx/html/static部署yaml中配置init容器:
- 采用与主容器相同的镜像
nginxinc/nginx-unprivileged:1.23.2 - 将
fix-perms.sh作为ConfigMap挂载到init容器 - 给init容器添加
securityContext.runAsUser: 0,临时以root身份执行权限修改 - 主容器启动命令设置为:
envsubst < /usr/share/nginx/html/static/env.template.js > /usr/share/nginx/html/static/env.js && nginx -g "daemon off;"
- 采用与主容器相同的镜像
方案3:构建自定义镜像(长期场景推荐)
如果频繁遇到此类需求,可基于nginx-unprivileged构建自定义镜像,提前配置好权限和脚本:
编写Dockerfile:
FROM nginxinc/nginx-unprivileged:1.23.2 # 修改静态目录权限为nginx用户可写 RUN chown -R nginx:nginx /usr/share/nginx/html/static # 复制启动脚本和模板文件 COPY start-nginx.sh /usr/local/bin/ COPY env.template.js /usr/share/nginx/html/static/ # 给启动脚本添加执行权限 RUN chmod +x /usr/local/bin/start-nginx.sh # 设置容器启动命令 CMD ["start-nginx.sh"]启动脚本
start-nginx.sh:#!/bin/sh envsubst < /usr/share/nginx/html/static/env.template.js > /usr/share/nginx/html/static/env.js nginx -g "daemon off;"OpenShift部署流程:
- 通过BuildConfig或Buildah构建镜像,推送到内部镜像仓库
- 部署自定义镜像,传入所需环境变量即可自动生成env.js
内容的提问来源于stack exchange,提问作者JarochoEngineer
相关产品推荐
相关产品推荐

