【问题标题】:docker can not write on mounted volume with non-root userdocker 无法使用非 root 用户在已安装的卷上写入
【发布时间】:2021-04-09 11:54:13
【问题描述】:

我有来自 nginx 映像的带有 myuser 的 Dockerfile,我想在已安装的位置挂载日志,我正在使用 docker-compose 来启动容器。我的要求是只使用非 root 用户而不使用 sudo。

我的 dockerfile 和 myuser,我创建的图像标签是 mynginx:v1

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

非工作 docker compose with mynginx image with myuser

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

尝试查看各种选项,但到目前为止没有运气。

【问题讨论】:

  • 您能否在 docker 之外使用与容器用户相同的 uid 写入该目录?

标签: docker


【解决方案1】:

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

解决方案

如果你想从你的容器内写入到你主机的目录中,你必须首先在你的主机上创建一个myuser 用户并通过检查它的 UID

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

在此示例中,UID=1000 和 GID=100。

现在您需要在主机上创建一个文件夹~/log/nginx,其所有者/组为myuser

$ sudo mkdir ~/log/nginx
$ sudo chown myuser ~/log/nginx
$ sudo chmod -R 0700 ~/log/nginx/

之后,您可以使用相同的 UID/GID 创建一个 Dockerfile 和您的用户。

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 ),有什么想法吗?
  • 另一种方法是动态添加您的用户并通过类似于 dockcross 项目使用的入口点脚本设置权限(在容器启动时)。见:github.com/dockcross/dockcross/blob/master/imagefiles/…
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 2020-12-28
  • 2019-12-21
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多