Docker无法使用非根用户在已挂载的卷上写入数据

10

我有一个Dockerfile,使用了来自Nginx镜像的myuser,并想将日志挂载到指定位置。我使用docker-compose启动容器。我的要求是只能使用非root用户,且不能使用sudo。

我的Dockerfile使用myuser,创建的镜像标签为mynginx:v1

RUN addgroup mygroup
RUN adduser myuser --disabled-password
USER myuser

使用myuser镜像的mynginx Docker Compose无法工作

version: "2"
services:
  nginx:
    container_name: nginx
    image: mynginx:v1
    ports:
      - "8888:80"
    volumes:
      - ./log/nginx:/var/log/nginx

尽管目录已经被挂载,但在主机上无法查看nginx日志文件access.log和error.log。
Docker日志如下:
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2021/04/09 12:46:08 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
2021/04/09 12:46:08 [emerg] 1#1: mkdir() "/var/cache/nginx/client_temp" failed (13: Permission denied)

然而,如果我使用以root用户身份运行的官方nginx镜像执行相同的操作,则一切正常。

使用root用户的官方nginx镜像的工作docker compose

version: "2"
services:
  nginx:
    container_name: nginx
    image: nginx
    ports:
      - "8888:80"
    volumes:
      - ./log/nginx:/var/log/nginx

尝试了各种选项,但到目前为止都没有成功。


1
在 Docker 之外,你能使用与容器用户相同的 uid 写入那个目录吗? - BMitch
1个回答

13

很可能您主机上的 myuser 的 UID 与容器内的 myuser 的 UID 不匹配。

解决方案

如果您想要从容器内部写入到主机机器的目录中,您必须首先在主机上创建一个名为 myuser 的用户,并检查其 UID。

$ sudo su - myuser -c "id"
uid=1000(myuser) gid=100(users) Gruppen=100(users)

在此示例中,UID=1000且GID=100。
现在您需要在主机上创建所有者/组为myuser的文件夹~/log/nginx。
$ sudo mkdir ~/log/nginx
$ sudo chown myuser ~/log/nginx
$ sudo chmod -R 0700 ~/log/nginx/

之后,您可以创建一个Dockerfile以及与您的用户相同UID/GID的用户。
RUN useradd myuser -u 1000 -g 100 -m -s /bin/bash
USER myuser

现在,您应该可以使用指定的用户将内容写入已挂载的卷中。您可以通过以下方式检查此操作:

docker run -v $(pwd)/log/nginx:/var/log/nginx --rm -it mynginx:v1 /bin/bash

如果您现在可以写入/var/log/nginx


是的,这似乎可以工作,尽管官方nginx镜像不支持非root用户,我不得不对Dockerfile进行更多修改才能使其工作。我想要了解的唯一事情是如何在主机文件夹上授予权限,除了您提到的方式(除了在Dockerfile本身中添加sudo之外),还有什么想法吗? - Learner
另一种方法是通过类似于dockcross项目使用的入口脚本动态添加用户并设置权限(在容器启动时)。请参见:https://github.com/dockcross/dockcross/blob/master/imagefiles/entrypoint.sh - A.K.
@Learner 这里有 https://hub.docker.com/r/nginxinc/nginx-unprivileged - Martynas Jusevičius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接