OpenShift 中的 Nginx 配置

OpenShift 中的 Nginx 配置

我一直在努力寻找一个解决方案来运行 nginx,在 OpenShift 中,创建容器时不使用 root 用户。然后,我收到以下错误:

2023/06/21 10:37:45 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)
nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)

发生这种情况是因为用户不是 root。用于配置的 Dockerfile 如下:

# base image
FROM node:14.21.2 as build-deps

#more lines

RUN yarn build

FROM nginx:1.19-alpine
COPY --from=build-deps /usr/src/app/build /usr/share/nginx/html
COPY --from=build-deps /usr/src/app/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80

RUN printenv
RUN ln -s /tmp/env.js /usr/share/nginx/html/static/env.js
CMD ["sh", "-c", "envsubst < /usr/share/nginx/html/static/env.template.js > /tmp/env.js && exec nginx -g 'daemon off;'"]

然后,我修改了 nginx 镜像以使用nginxinc/nginx-非特权:1.23.2以避免在创建目录时出现问题/var/cache/nginx/client_temp。我修改了上面显示的 Dockerfile 以删除符号链接,并修改了最后一行以引用原始路径:

CMD ["sh", "-c", "envsubst < /usr/share/nginx/html/static/env.template.js > /usr/share/nginx/html/static/env.js && exec nginx -g 'daemon off;'"]

但是,由于此映像(Debian OS)使用 nginx 作为用户,因此我在创建文件 env.js 时遇到问题:

sh: 1: cannot create /usr/share/nginx/html/static/env.js: Permission denied

如果我想继续创建符号链接作为第一个 dockerfile 示例,那么我会收到以下错误:

ln: failed to create symbolic link '/usr/share/nginx/html/static/env.js': Permission denied

该图像使用属于 nginx 组的 nginx:

$ howami
/bin/sh: 1: howami: not found
$ id nginx
uid=101(nginx) gid=101(nginx) groups=101(nginx)

尝试创建指向静态文件夹中的 env.js 文件的符号链接失败,因为 nginx 不是根组的一部分:

$ cd /usr/share/nginx/html/
$ ls -ltr
drwxr-xr-x 5 root root 4096 Jun 20 22:58 static

我无法更改目录的权限,因为这是在容器启动之前发生的。

我怎样才能以与尝试使用 envsubst 相同的方式在 /usr/share/nginx/html/static 文件夹下获取环境变量并让 env.js 具有这些值?

多谢

答案1

我一直在努力寻找一个解决方案来运行 nginx,在 OpenShift 中创建容器时不使用 root 用户。

这不对;虽然 OpenShift 默认不允许您以 root 身份运行容器,但您当然可以配置必要的权限。如果您使用的是 OpenShift 4,那么感兴趣的文档是“管理安全上下文约束“。

昨天,我为一位同事整理了一个例子来演示这一点;你可以找到它这里


在您的 Dockerfile 中,此命令失败:

RUN ln -s /tmp/env.js /usr/share/nginx/html/static/env.js

那是因为:

  • /usr/share/nginx/html归 root 所有
  • 您当前正在以nginx用户身份运行

root您可以通过在 Dockerfile 中明确切换到用户来解决这个问题:

USER root
RUN ln -s /tmp/env.js /usr/share/nginx/html/static/env.js
USER nginx

相关内容