如何更改官方docker镜像nginx的nginx进程用户?

时间:2016-04-24 14:13:50

标签: nginx docker

我正在使用Docker Hub的官方nginx图片: https://hub.docker.com/_/nginx/

nginx的用户(在/etc/nginx/nginx.conf中定义)是nginx。有没有办法让nginx作为www-data运行而不必扩展docker镜像?这样做的原因是,我有一个共享卷,由多个容器使用 - php-fpm我正在运行www-datanginx。共享卷中文件/目录的所有者为www-data:www-datanginx无法访问该文件/目录 - 与*1 stat() "/app/frontend/web/" failed (13: Permission denied)类似的错误

我有一个docker-compose.yml并运行我的所有容器,包括带有docker-compose up的nginx容器。

  ...
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./:/app
      - ./vhost.conf:/etc/nginx/conf.d/vhost.conf
    links:
      - fpm

  ...

4 个答案:

答案 0 :(得分:7)

FYI

  1. 是php-fpm图像的问题
  2. 不是关于用户名,而是关于www-data用户ID
  3. 怎么做

    修复你的php-fpm容器并且不要打破好的nginx容器。

    解决方案

答案 1 :(得分:0)

我知道OP要求一种不扩展nginx图像的解决方案,但是我在没有这种约束的情况下就已经登陆了。因此,我将这个Dockerfile设置为以www-data:www-data33:33)的身份运行nginx:

FROM nginx:1.17

# Customization of the nginx user and group ids in the image. It's 101:101 in
# the base image. Here we use 33 which is the user id and group id for www-data
# on Ubuntu, Debian, etc.
ARG nginx_uid=33
ARG nginx_gid=33

# The worker processes in the nginx image run as the user nginx with group
# nginx. This is where we override their respective uid and guid to something
# else that lines up better with file permissions.
# The -o switch allows reusing an existing user id
RUN usermod -u $nginx_uid -o nginx && groupmod -g $nginx_gid -o nginx

在映像构建期间,它在命令行上接受uid和gid。制作一个以您当前的用户ID和组ID运行的Nginx图像,例如:

docker build --build-arg nginx_uid=$(id -u) nginx_uid=$(id -g) .

nginx用户和组ID当前在图像中hardcoded to 101:101

答案 2 :(得分:0)

另一种选择是从https://github.com/nginxinc/docker-nginx获取源代码并更改docker文件以支持build args Ex:更改buser版本(https://github.com/nginxinc/docker-nginx/blob/master/stable/buster/Dockerfile)的稳定Dockerfile。将nginx用户/组uid / gid设置为构建args

FROM debian:buster-slim

LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"

ENV NGINX_VERSION   1.18.0
ENV NJS_VERSION     0.4.3
ENV PKG_RELEASE     1~buster

#Change NGNIX guid/uid#
ARG nginx_guid=101
ARG nginx_uid=101

RUN set -x \
# create nginx user/group first, to be consistent throughout docker variants
    && addgroup --system --gid $nginx_guid nginx \
    && adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid $nginx_uid nginx \

这种方法比仅执行usermod更为安全,因为如果在其他地方进行了某些操作,例如 chown nginx:nginx将使用GUID / UID设置

答案 3 :(得分:-1)

制作泊坞文件。写在第一行

var str = "this is the .string .needed to .be .tested";
var res = []; 
str.replace(/\.(\w+)/g, function(match) {
  res.push(match.slice(1))
});
console.log(res);