【问题标题】:Docker volume mariadb has root permissionDocker 卷 mariadb 具有 root 权限
【发布时间】:2021-12-28 21:47:43
【问题描述】:

我在使用 docker compose 文件(MariaDB、RabbitMQ、Maven)启动 docker 容器时偶然发现了 docker 卷的问题。我只是用docker-compose up -d(没有SUDO)开始他们

我的卷是这样定义的:

...
volumes:
  - ./production/mysql:/var/lib/mysql:z
...

一切正常,./production 目录已创建(映射卷的位置)

但是当我再次尝试使用 down/up 重新启动 docker 容器时,我收到以下错误:

error checking context: 'no permission to read from '…/production/mysql/aria_log.00000001'

当我检查提到的文件时,我发现它需要 root:root 权限。这是因为该文件是使用容器内的 root 用户生成的。所以我尝试使用docs 中提到的命名空间。

无论如何,错误仍然存​​在。有什么想法或参考吗?

谢谢。

Docker 编写文件:

version: '3.8'

services:
  mysql:
    image: mariadb:latest
    restart: always
    env_file:
      - config.env
    volumes:
      - ./production/mysql:/var/lib/mysql:z
    environment:
      MYSQL_DATABASE: ${DATABASE_NAME}
      MYSQL_USER: ${DATABASE_USER}
      MYSQL_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
    networks:
      - testnetwork

networks:
  testnetwork:


【问题讨论】:

  • 不要忘记删除文件并让容器重新创建它。或者赋予它与映射的 root 用户相同的所有权。如果文件是使用主机的根创建的,则用户命名空间映射的根将无权访问它;它们是不同的用户 ID,权限掩码将无法通过验证。
  • @edd 是的,我删除了它们。给予与映射的 root 用户相同的所有权将是我的首选解决方案。您对此有任何参考或指南吗?
  • 主机上的文件所有权是什么?你在使用用户命名空间吗?这是 RHEL,Docker for Mac,描述你的主机。最重要的是,您甚至需要主机访问这些文件,为什么不使用命名卷?
  • @BMitch 在主机系统上,文件所有权为root:root。是的,我也尝试了命名空间,然后他们配置了 uid/gid。无论如何,我得到同样的错误。不,我不需要访问这些文件,所以我可以使用命名卷。我只是想把它放在一个目录中,以简化一切。
  • 你是什么意思 wihtout sudo 正在使用无根 docker 或者你的用户是 docker 组的成员。 grep docker /etc/group 向您展示了什么?它会显示您的用户吗?

标签: docker ubuntu docker-compose mariadb permission-denied


【解决方案1】:

问题来自主机用户/组 ID 与容器内的 ID 之间的映射。一种解决方案是使用命名卷并避免所有这些麻烦,但您也可以执行以下操作:

在 docker-compose 文件中将 user: ${UID}:${GID} 添加到您的服务中。
运行UID=${id -u} GID=${id -g} docker-compose up。这样可以确保容器中的用户与主机上的用户具有相同的 UID/GID,并且在容器中创建的文件将具有适当的权限。

注意: Docker for Mac(使用osxfs 驱动程序)在后台执行此操作,您无需担心用户和组。

【讨论】:

    【解决方案2】:

    以非 root 用户身份运行 Docker 守护程序,这对您的目的很有帮助。

    所有文档都是here

    【讨论】: