【发布时间】: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