首页 > 解决方案 > mysql 'volume' 的一些奇怪(或不是)的事情

问题描述

只需使用 docker-compose.yaml 创建数据库服务:

# another db service for test

version: '3.5'

networks:
  dockernet:
    driver: bridge

services:
  db:
    image: mysql/mysql-server:5.5.62
    restart: on-failure
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./mysql_dir:/var/lib/mysql
    networks:
      - dockernet

接下来,在我的 ~ 中添加目录“mysql”:

docker:~/docker$ ls -l
total 8
-rw-r--r--    1 futur    futur          674 Nov  5 04:35 docker-compose.yaml
drwxr-sr-x    2 futur    futur         4096 Nov  5 04:37 mysql_dir

我将我的帐户添加到组“docker”:

docker:~/docker$ grep docker /etc/group
docker:x:101:futur

在上/下我的 docker-compose 之后,我看到我的目录的权限发生了奇怪的变化:

docker:~/docker$ ls -l
total 8
-rw-r--r--    1 futur    futur          298 Nov  5 05:10 docker-compose.yaml
drwxr-sr-x    5 27       video         4096 Nov  5 05:11 mysql_dir

为什么会变成“27”和“视频”?那是什么?这正常吗?

这种行为会阻止我(用户“futur”)复制和移动目录“mysql_dir”。

我应该只从 root 用户使用 docker 吗?有没有办法使用docker避免使用root用户?

标签: dockerdocker-composevolume

解决方案


如果你在你的主机上运行,​​检查容器中文件夹的docker exec <your_container> stat /var/lib/mysql权限,那么你会看到它的 uid 是(user ) 并且 gid 是(group ) :/var/lib/mysql27mysql27mysql

  File: '/var/lib/mysql'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
...
Access: (0750/drwxr-x---)  Uid: (   27/   mysql)   Gid: (   27/   mysql)
...

当您在主机和容器之间挂载卷时,Docker 会根据容器内的内容(此处为uid=27, gid=27)更改主机上挂载目录的权限。

您从主机上看到的内容是正常的:27因为您的主机上没有任何用户uid=27,并且您看到videogroup 因为该组gid=27在您的主机上(您可以通过运行来验证getent group video)。

您可以更改mysql容器内的 uid 和 gid 以匹配主机上的内容,但我强烈建议您不要这样做。与其挂载本地目录,不如使用volumes,例如,如果要备份数据。


推荐阅读