Docker卷mariadb具有根权限。

5

我在使用docker-compose文件启动docker容器时(MariaDB、RabbitMQ和Maven),遇到了与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用户生成。因此,我尝试像文档中提到的那样使用命名空间。
无论如何,错误仍然会出现。有任何想法或参考资料吗?
谢谢。
Docker Compose File:
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:



2
主机上的文件所有权是什么?您是否使用用户命名空间?这是在RHEL、Docker for Mac上吗?请描述一下您的主机。最重要的是,您是否真的需要访问主机上的这些文件,为什么不使用命名卷? - BMitch
@BMitch 在主机系统上,文件所有权为“root:root”。是的,我也尝试过名称空间,然后它们具有配置的uid/gid。无论如何,我得到了相同的错误。不,我不需要访问那些文件,所以我可以使用命名卷。我只是想把它放在一个目录中,以简化一切都在一个地方的情况。 - kaulex
2
你说的“wihtout sudo”是指你正在使用无根Docker,还是你的用户是docker组的成员?grep docker /etc/group会显示什么?它会显示你的用户吗? - Iduoad
当我在我的环境和“Docker Playground”中测试时,它能够正常工作! Mariadb容器确实会在mysql用户(999:999)下创建日志文件。从容器外部看,这是我得到的结果-rw-rw---- 1 999 ping 417792 Jan 6 16:04 aria_log.00000001,这相当于主机中的999:999。 - Iduoad
我不明白。Docker守护进程始终以root用户身份运行。如果您在使用docker命令时不想使用sudo,创建一个名为docker的Unix组并将用户添加到其中。您的用户是docker组的成员。因此,即使您没有键入sudo,它也会以sudo开始。那么,为什么你说你间接地启动它而没有sudo?我会说你间接地带着sudo启动它。然后错误就很惊人了。你是否使用sudo usermod -aG docker $ USER正确添加了你的用户?来源:https://askubuntu.com/questions/477551/how-can-i-use-docker-without-sudo - questionto42
显示剩余6条评论
2个回答

4
问题出在主机用户/组 ID 与容器内的用户/组 ID 映射上,其中一种解决方案是使用命名卷并避免所有这些麻烦,但你也可以执行以下操作:
user: ${UID}:${GID} 添加到 docker-compose 文件中的服务中。 运行 UID=${id -u} GID=${id -g} docker-compose up。这样您就可以确保容器中的用户将具有与主机上的用户相同的 UID/GID,并且在容器中创建的文件将具有适当的权限。
注意:Docker for Mac(使用 osxfs 驱动程序)会在幕后执行此操作,因此您不必担心用户和组。

1

将Docker守护程序作为非根用户运行,这对您的目的可能有所帮助。

所有文档都在这里


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