在Openshift上以非root用户身份运行nginx,并在端口80上侦听

我已经连续几天尝试configuration一个在Openshift上运行的nginx容器,直到现在,它没有得到它的工作。

我已阅读有关使用非root用户的安全性原因。 但是,无论是root用户还是非root用户,openshift都不允许我在端口80的容器中创build绑定。

2017/06/22 21:18:57 [emerg] 1#1: bind() to 0.0.0.0:80 failed (13: Permission denied) nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) 

在我的本地机器上,我可以成功绑定到容器上的更高端口(例如8081),然后在主机maschine中创build一个访问映射( docker run --rm -d -p 9000:8081 mynginx )。 这样我可以成功地到达主机地址localhost:9000的网站,但我没有ideia我怎么能在openshit上实现类似的东西。

我希望我可以使用非root用户和nginx在更高端口(8081)上部署映像,同时openshift将服务器的端口80的所有传入stream量转发到容器的端口8081(nginx) 。 我目前的设置如下:

Dockerfile:

 FROM nginx:alpine COPY nginx.conf /etc/nginx/nginx.conf COPY dist /usr/share/nginx/html RUN chmod -R 777 /var/log/nginx /var/cache/nginx /var/run \ && chgrp -R 0 /etc/nginx \ && chmod -R g+rwX /etc/nginx \ && rm /etc/nginx/conf.d/default.conf EXPOSE 8081 

和我的nginx.conf文件:

 worker_processes 4; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { ssl_session_cache shared:SSL:10m; ssl_session_timeout 30m; #See http://blog.argteam.com/coding/hardening-node-js-for-production-part-2-using-nginx-to-avoid-node-js-load proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=3000m inactive=600m; proxy_temp_path /var/tmp; include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; gzip_comp_level 6; gzip_vary on; gzip_min_length 1000; gzip_proxied any; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip_buffers 16 8k; server { listen 8081; server_name localhost; location / { root /usr/share/nginx/html; index index.html; expires -1; add_header Pragma "no-cache"; add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; try_files $uri$args $uri$args/ $uri $uri/ /index.html =404; } } } 

Obs:部署在pipe道进程中自动发生。 我正在使用gitlab的一个定制的 docker镜像,负责部署到openshift。 此自定义图像使用openshift原始CLI来处理部署。

使用端口8080监听。 当您在OpenShift之外公开Web服务器的服务时,外部路由将默认使用端口80,并确保stream量在内部路由到Web服务器的端口8080。 如果将服务内部联系到OpenShift,您将需要通过端口8080联系它。

另外,请注意,如果您想要执行的操作是托pipe一些静态文件,则可以使用nginx的S2I构build器。

至less看看它是如何做的事情。