我目前在尝试在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中不可用。但是用户是组根的一部分。现在,这里应该说明如何处理
我什至走得更远,为了测试目的,使整个/ 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
有效。 (但是我在构建时遇到了其他一些问题,所以我改用了阿尔卑斯山脉)
任何想法为何仍然无法解决?
答案 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