Openshift Nginx 权限问题 [nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" 失败 (13: 权限被拒绝)]



我目前在Openshift中尝试设置nginx:alpine时遇到了一个问题。

我的构建运行得很好,但我无法在权限被拒绝的情况下部署,出现以下错误

2019/01/25 06:30:54[emerg]1:mkdir()"/var/cache/nginx/client_temp";失败(13:权限被拒绝)

nginx:[emerg]mkdir()"var/cache/nginx/client_temp";失败(13:权限被拒绝)

现在我知道Openshift在权限方面有点棘手,因为容器在没有根特权的情况下运行,并且UID在运行时间生成,这意味着它在/etc/passwd中不可用。但是用户是root组的一部分。现在,正在描述如何处理这一问题

https://docs.openshift.com/container-platform/3.3/creating_images/guidelines.html#openshift-集装箱平台特定指南

我甚至更进一步,为了测试的目的,使整个/var/完全可以访问(777),但我仍然会收到错误。这就是我的Dockerfile的

Dockerfile

FROM nginx:alpine
#Configure proxy settings
ENV HTTP_PROXY=http://my.proxy:port
ENV HTTPS_PROXY=http://my.proxy:port
ENV HTTP_PROXY_AUTH=basic:*:username:password
WORKDIR /app
COPY . .
# Install node.js
RUN apk update && 
apk add nodejs npm python make curl g++

# Build Application
RUN npm install
RUN ./node_modules/@angular/cli/bin/ng build
COPY ./dist/my-app /usr/share/nginx/html
# Configure NGINX
COPY ./openshift/nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./openshift/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
RUN chgrp -R root /var/cache/nginx /var/run /var/log/nginx && 
chmod -R 777 /var
RUN sed -i.bak 's/^user/#user/' /etc/nginx/nginx.conf
EXPOSE 8080

有趣的是,这种方法似乎只是影响了nginx的高山版本。nginx:latest(我认为基于debian)没有问题,这里描述了的设置方法

https://torstenwalter.de/openshift/nginx/2017/08/04/nginx-on-openshift.html

工作。(但我对这个版本有一些其他问题,所以我换成了alpine)

有什么想法为什么这仍然不起作用吗?

我使用的是openshift,权限有限,所以我使用以下nginx映像(而不是nginx:latest)解决了这个问题

FROM nginxinc/nginx-unprivileged 

解决此问题。我认为这个Dockerfile中的问题是我使用COPY命令来移动我的构建,但这并不存在。这是我正在工作的

Dockerfile

FROM nginx:alpine
LABEL maintainer="ReliefMelone"
WORKDIR /app
COPY . .
# Install node.js
RUN apk update && 
apk add nodejs npm python make curl g++

# Build Application
RUN npm install
RUN ./node_modules/@angular/cli/bin/ng build --configuration=${BUILD_CONFIG}
RUN cp -r ./dist/. /usr/share/nginx/html
# Configure NGINX
COPY ./openshift/nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./openshift/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
RUN chgrp -R root /var/cache/nginx /var/run /var/log/nginx && 
chmod -R 770 /var/cache/nginx /var/run /var/log/nginx
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]

请注意,在构建应用程序部分中,我现在执行

RUN cp -r ./dist/. /usr/share/nginx/html

而不是

COPY ./dist/my-app /usr/share/nginx/html

复制将不起作用,因为我以前在容器内部运行ng builddist也只存在于容器中,所以我需要在容器内部执行复制命令

在我的nginx:alpineDockerfile 上出现相同错误

nginx:alpine图像中已经存在一个名为nginx的用户。我的猜测是,用它来运行nginx更干净。

以下是我解决问题的方法:

  • /var/cache/nginx的所有者设置为nginx(用户101,组101)
  • 创建一个/var/run/nginx.pid并将所有者设置为nginx
  • 使用--chown=nginx:nginx将所有文件复制到图像
FROM nginx:alpine
RUN  touch /var/run/nginx.pid && 
chown -R nginx:nginx /var/cache/nginx /var/run/nginx.pid
USER nginx
COPY --chown=nginx:nginx my/html/files /usr/share/nginx/html
COPY --chown=nginx:nginx config/myapp/default.conf /etc/nginx/conf.d/default.conf
...

如果您在这里是因为未能部署示例helm图表(例如:helm-create-mychart),请按照建议的@p准多项式操作,而是更改您的部署文件以获取正确的图像。

containters: 
- image: nginxinc/nginx-unprivileged 

关于官方无特权图片的更多信息:https://github.com/nginxinc/docker-nginx-unprivileged

可能是也可能不是朝着正确的方向迈出的一步(对于那些来这里寻求[emerg] mkdir() ... failed错误的一般帮助的人来说尤其有用)。

该解决方案来自Builing nginx。

我花了大约七个小时才意识到这个解决方案与编译nginx时设置的前缀路径直接相关。

这就是我的配置抛出nginx的地方(作为一个非常简短的例子),它是从以下nginx源代码编译的:

sudo ./auto/configure 
--prefix=/usr/local/nginx 
--http-client-body-temp-path=/tmp/nginx/client-body-temp 
--http-fastcgi-temp-path=/var/tmp/nginx/fastcgi_temp 

在没有意识到的情况下,我将前缀设置为/usr/local/nginx,但设置客户端主体临时路径&fastcgi-temp路径/tmp/nginx内的一个目录。

这基本上破坏了nginx访问正确文件的能力,因为临时路径与前缀路径不相关。

所以我通过(再次,以超级简单的配置为例)修复了它:

sudo ./auto/configure 
--prefix=/usr/local/nginx 
--http-client-body-temp-path=/usr/local/nginx/client_body_temp 
--http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp 

进一步简化:

sudo ./auto/configure 
--prefix=/usr/local/nginx 
--http-client-body-temp-path=/client_body_temp 
--http-fastcgi-temp-path=/fastcgi_temp 

同样,不能保证工作,但绝对是朝着正确方向迈出的一步。

您可以使用nginx.conf文件更改文件夹。您可以在以非root用户身份运行nginx一节中阅读更多信息。

运行以下命令来解决上述问题。需要anyuid安全上下文约束。

oc adm policy add-scc-to-user anyuid system:serviceaccount:<NAMESPACE>:default

最新更新