【问题标题】:Openshift Nginx permission problem [nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)]Openshift Nginx权限问题【nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)]
【发布时间】:2019-06-18 23:45:45
【问题描述】:

我目前在尝试在 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: Permission denied)

现在我知道 Openshift 在权限方面有点棘手,因为容器在没有 root 权限的情况下运行,并且 UID 是在 runetime 上生成的,这意味着它在 /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

有效。 (但我在构建时遇到了一些其他问题,所以我切换到 alpine)

任何想法为什么这仍然不起作用?

【问题讨论】:

  • 我猜你在docker-compose.yml 文件中的某个地方设置了user,这就是导致问题的原因,因为用户是非root 用户。 nginx 服务需要绑定端口并且必须是 root。
  • 您是否能够解决问题,在关注torstenwalter.de 链接后删除了所有错误,但仍然存在nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)。虽然 usnig nginx:latest 而不是 nginx:alpine 解决了这个问题

标签: docker nginx openshift root alpine


【解决方案1】:

解决这个问题。我认为这个 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 build,dist 也只会存在于容器中,因此我需要在该容器内执行复制命令

【讨论】:

    【解决方案2】:

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

    FROM nginxinc/nginx-unprivileged 
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        如果您因为未能部署示例 helm 图表(例如:helm create mychart)而来到这里,请按照 @quasipolynomial 的建议执行操作,而是更改您的部署文件,拉取正确的图像。

        即

        containters: 
            - image: nginxinc/nginx-unprivileged 
        

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            可能是也可能不是朝着正确方向迈出的一步(对于那些来这里寻求关于[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临时路径设置为/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 \
            

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

            【讨论】:

              【解决方案7】:

              在我的nginx:alpine Dockerfile 上出现同样的错误

              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
              ...
              
              

              【讨论】:

                猜你喜欢
                • 2022-01-23
                • 2021-01-31
                • 2013-08-31
                • 2019-12-17
                • 2022-01-02
                • 2015-05-25
                • 1970-01-01
                • 2016-06-06
                • 2016-03-26
                相关资源
                最近更新 更多