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

rel*_*one 6 nginx root openshift docker alpine-linux

我目前在尝试在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的样子

Docker文件

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
Run Code Online (Sandbox Code Playgroud)

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

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

作品。(但是我在构建时遇到其他问题,所以我改用了阿尔卑斯山)

任何想法为什么仍然无法正常工作?

rel*_*one 6

为了解决这个问题。我认为这个 Dockerfile 中的问题是我使用 COPY 命令来移动我的构建并且不存在。所以这是我的工作

文件

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 Code Online (Sandbox Code Playgroud)

请注意,在构建应用程序部分我现在做

RUN cp -r ./dist/. /usr/share/nginx/html
Run Code Online (Sandbox Code Playgroud)

代替

COPY ./dist/my-app /usr/share/nginx/html
Run Code Online (Sandbox Code Playgroud)

复制将不起作用,因为我之前在容器内运行了ng build,dist 也仅存在于容器中,因此我需要在该容器内执行复制命令


qua*_*ial 6

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

FROM nginxinc/nginx-unprivileged 
Run Code Online (Sandbox Code Playgroud)


Lud*_*c C 5

nginx:alpine我的Dockerfile上有同样的错误

nginx图像中已经有一个用户打电话nginx:alpine。我的猜测是用它来运行 nginx 会更干净。

我是这样解决的:

  • 将所有者设置为/var/cache/nginxnginx用户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
...

Run Code Online (Sandbox Code Playgroud)