如何更改正式docker映像nginx的nginx进程用户?

如何更改正式docker映像nginx的nginx进程用户?,nginx,docker,Nginx,Docker,我正在使用Docker Hub的官方nginx图像: nginx的用户(定义见/etc/nginx/nginx.conf)是nginx。有没有一种方法可以让nginx作为www-data运行,而不必扩展docker映像?原因是,我有一个共享卷,它由多个容器使用-php fpm,我作为www-data和nginx运行。共享卷中文件/目录的所有者是www-data:www-data,并且nginx无法访问该文件/目录-类似于*1 stat()“/app/frontend/web/”的错误失败(13

我正在使用Docker Hub的官方nginx图像:

nginx的用户(定义见/etc/nginx/nginx.conf)是
nginx
。有没有一种方法可以让nginx作为
www-data
运行,而不必扩展docker映像?原因是,我有一个共享卷,它由多个容器使用-
php fpm
,我作为
www-data
nginx
运行。共享卷中文件/目录的所有者是
www-data:www-data
,并且
nginx
无法访问该文件/目录-类似于
*1 stat()“/app/frontend/web/”的错误失败(13:权限被拒绝)

我有一个
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

  ...

制作docker文件。写在最上面一行

From nginx
Then change config

Cmd["nginx"]
供参考
  • 这是php fpm图像的问题
  • 这不是关于用户名,而是关于www数据用户ID
  • 怎么办 修复php fpm容器,不要破坏好的nginx容器

    解决
    • 这是我的帖子,里面有docker compose的解决方案(nginx+ php fpm(阿尔卑斯山):

    • 下面是我的帖子,其中包含php fpm(debian)容器的解决方案

    • 官方php fpm图像解决方案。创建Dockerfile:

      FROM php:5.6-fpm
      RUN usermod -u 1000 www-data
      

    我知道OP要求提供一个不扩展nginx映像的解决方案,但我在这里没有这个限制。所以我制作了这个
    Dockerfile
    来运行nginx作为
    www-data:www-data
    33:33
    ):

    在生成映像期间,它在命令行上接受uid和gid。要制作作为当前用户id和组id运行的nginx映像,例如:

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

    nginx用户和组ID当前在映像中。

    另一个选项是从获取源代码并更改docker文件以支持构建参数,例如更改buser release()的稳定docker文件。将nginx用户/组uid/gid设置为生成参数

    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 \
    
    来自debian:buster slim的
    
    标签维护者=“NGINX Docker维护者”
    ENV NGINX_版本1.18.0
    ENV NJS_版本0.4.3
    环境包发布1~buster
    #更改NGNIX guid/uid#
    ARG nginx_guid=101
    ARG nginx_uid=101
    运行集合-x\
    #首先创建nginx用户/组,以便在整个docker变体中保持一致
    &&addgroup--系统--gid$nginx\u guid nginx\
    &&adduser--system--disabled login--ingroup nginx--no create home--home/不存在--gecos“nginx user”-shell/bin/false--uid$nginx\u uid nginx\
    
    这种方法比仅仅使用usermod更安全,因为如果在其他地方(如
    chown nginx:nginx它将使用GUID/UID集

    我认为更好的方法是创建您自己的Dockerfile,这样它是可复制的。您可以登录到容器,更改用户并重新启动容器,但这可能是将来的维护问题。我知道这一点。但我正在寻找一种在运行时(通过env变量或其他方式)完成这项工作的方法。经过数小时的搜索后,我得到了很大的帮助!我建议其他与我有相同问题的人(Docker-nginx-php-fpm组合的权限)注意这里。对于
    php:rc-fpm-alpine
    alpine linux映像,
    usermod
    不存在,因为alpine使用busybox。以下是等效的:
    运行deluser www-data&&adduser-DH-h/home/www-data-s/sbin/nologin-u 1000 www-data
    ——希望对使用alpine的人有所帮助。为什么是1000???Nginx容器中的Nginx用户不是
    1000
    ,因此如果在尝试运行usermod之前运行alpine Nginx add shadow,则无权读取由
    php fpm
    创建的文件。将上面的usermod行更改为:运行apk add shadow&&usermod-u$nginx\u uid-o nginx&&groupmod-g$nginx\u gid-o nginx
    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 \