我目前在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: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
...
如果您在这里是因为未能部署示例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