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

时间:2019-01-25 06:46:04

标签: docker nginx openshift root alpine

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

我的构建运行正常,但由于以下错误而被拒绝,我无法部署

  

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

     

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

现在我知道Openshift在权限方面有些棘手,因为容器在没有root特权的情况下运行,并且UID在运行时更新,这意味着它在/ etc / passwd中不可用。但是用户是组根的一部分。现在,这里应该说明如何处理

https://docs.openshift.com/container-platform/3.3/creating_images/guidelines.html#openshift-container-platform-specific-guidelines

我什至走得更远,为了测试目的,使整个/ 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

有效。 (但是我在构建时遇到了其他一些问题,所以我改用了阿尔卑斯山脉)

任何想法为何仍然无法解决?

6 个答案:

答案 0 :(得分:1)

我使用的是openshift,权限有限,因此我通过使用以下nginx图像(而非nginx:latest)解决了此问题

FROM nginxinc/nginx-unprivileged 

答案 1 :(得分:1)

如果由于无法部署示例舵图(例如,helm create mychart)而在此处,则与建议的@quasipolynomial一样,但更改部署文件拉正确的映像。

containters: 
    - image: nginxinc/nginx-unprivileged 

有关官方非特权映像的更多信息:https://github.com/nginxinc/docker-nginx-unprivileged

答案 2 :(得分:0)

要解决此问题。我认为此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构建,因此该复制将不起作用,dist也将仅存在于容器中,因此我需要在该容器内执行复制命令< / p>

答案 3 :(得分:0)

您可以使用 nginx.conf 文件更改文件夹。您可以在 Running nginx as a non-root user 部分阅读更多信息。

答案 4 :(得分:0)

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

此解决方案从 Builing nginx from source 开始计算。

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

这是我的配置抛弃 nginx 的地方(作为一个非常简短的例子),从这个 nginx source 编译:

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临时路径设置为{{1}内的目录}}。

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

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

/tmp/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 \

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

答案 5 :(得分:-3)

运行以下命令来修复上述问题。所需的anyuid安全上下文约束。

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