【问题标题】:Docker: Permission denied to local MySQL volumeDocker:本地 MySQL 卷的权限被拒绝
【发布时间】:2021-03-28 10:15:39
【问题描述】:

我是 Docker 新手,不太了解 Linux。我正在尝试使用 Docker 构建自己的本地开发环境。我正在使用 docker-compose 实用程序。我想将 MySQL 数据存储在本地卷中。当我第一次运行docker-compose builddocker-compose up -d 命令时,没有错误。 MySQL 容器中的数据进入本地文件夹。一切都很好,除了一个:当我想更改我的 docker-compose.yml 文件并重建容器时,我得到一个错误

vo@vo-ThinkPad-Edge-E330:~/www/test$ docker-compose build
mysql uses an image, skipping
nginx uses an image, skipping
Building app
Traceback (most recent call last):
  File "bin/docker-compose", line 3, in <module>
  File "compose/cli/main.py", line 67, in main
  File "compose/cli/main.py", line 126, in perform_command
  File "compose/cli/main.py", line 302, in build
  File "compose/project.py", line 468, in build
  File "compose/project.py", line 450, in build_service
  File "compose/service.py", line 1125, in build
  File "docker/api/build.py", line 160, in build
  File "docker/utils/build.py", line 30, in tar
  File "docker/utils/build.py", line 49, in exclude_paths
  File "docker/utils/build.py", line 214, in rec_walk
  File "docker/utils/build.py", line 214, in rec_walk
  File "docker/utils/build.py", line 214, in rec_walk
  [Previous line repeated 1 more time]
  File "docker/utils/build.py", line 184, in rec_walk
PermissionError: [Errno 13] Permission denied: '/home/vo/www/test/docker/mysql/dbdata/performance_schema'
[301838] Failed to execute script docker-compose

我发现该文件夹的所有者是来自root 组的systemd-coredump。所以我有两种方法:

  1. sudo docker-compose build
  2. 删除具有sudo 权限的/home/vo/www/test/docker/mysql/dbdata 文件夹并再次运行docker-compose build

所以,我的问题是:这应该是这样还是有可能解决权限问题?

我的项目结构:

/
├── docker
│   ├── mysql
│   │   ├── conf
│   │   │   └── my.cnf
│   │   └── dbdata
│   ├── nginx
│   │   └── conf
│   │       └── nginx.conf
│   └── php
│       ├── conf
│       │   └── local.ini
│       ├── config
│       │   └── local.ini
│       └── Dockerfile
├── docker-compose.yml
└── src

我的docker-compose.yml

version: "3.7"
services:
  
  #PHP Service
  app:
    build:
      args:
        user: laravel
        uid: 1000
      context: ./
      dockerfile: ./docker/php/Dockerfile
    image: laravel-image
    container_name: laravel
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev  
    working_dir: /var/www/
    volumes:
      - ./src:/var/www
      - ./docker/php/config/local.ini:/usr/local/etc/php/conf.d/local.ini
    networks:
      - laravel
  
  #MySQL Service  
  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_PASSWORD: secret
      MYSQL_USER: laravel
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./docker/mysql/dbdata:/var/lib/mysql
      - ./docker/mysql/conf/my.cnf:/etc/mysql/my.cnf  
    networks:
      - laravel
  
  #Nginx Service
  nginx:
    image: nginx:1.17-alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    environment:
      SERVICE_NAME: nginx
      SERVICE_TAGS: dev        
    volumes:
      - ./src:/var/www
      - ./docker/nginx/conf:/etc/nginx/conf.d
    networks:
      - laravel    

#Networks
networks:
  laravel:
    driver: bridge

【问题讨论】:

    标签: linux docker docker-compose


    【解决方案1】:

    好的,我发现了一个窍门。在我的 docker-compose.yml in service volume 部分中,我必须使用命名卷而不是路径。例如,'mysqldbvolume' 而不是 './docker/mysql/dbdata'。然后我必须在顶级 volumes 键中定义一个命名卷:

    services: 
      #MySQL Service  
      mysql:
        image: mysql:5.7
        ...
        volumes:
          - mysqldbvolume:/var/lib/mysql
          - ./docker/mysql/conf/my.cnf:/etc/mysql/my.cnf
        ...
    
    ...
    
    # Volumes
    volumes:
      mysqldbvolume:
        driver: local
    

    那么,我的音量现在在哪里?如果我想查看我的卷列表,我必须运行docker volume ls

    DRIVER    VOLUME NAME
    local     test_mysqldbvolume
    local     test_postgresdbvolume
    

    检查卷 - docker volume inspect test_mysqldbvolume:

    [
        {
            "CreatedAt": "2020-12-17T21:54:53+02:00",
            "Driver": "local",
            "Labels": {
                "com.docker.compose.project": "test",
                "com.docker.compose.version": "1.27.4",
                "com.docker.compose.volume": "mysqldbvolume"
            },
            "Mountpoint": "/var/lib/docker/volumes/test_mysqldbvolume/_data",
            "Name": "test_mysqldbvolume",
            "Options": null,
            "Scope": "local"
        }
    ]
    

    所以,路径是 "Mountpoint": "/var/lib/docker/volumes/test_mysqldbvolume/_data"

    以普通用户ls -la /var/lib/docker/volumes/test_mysqldbvolume/_data 运行,表示访问被拒绝。但如果我运行sudo ls -la /var/lib/docker/volumes/test_mysqldbvolume/_data,我会看到我的体积数据:

    drwxrwxrwt 6 systemd-coredump systemd-coredump     4096 дек 17 21:54 .
    drwxr-xr-x 3 root             root                 4096 дек 17 21:42 ..
    -rw-r----- 1 systemd-coredump systemd-coredump       56 дек 17 21:42 auto.cnf
    -rw------- 1 systemd-coredump systemd-coredump     1676 дек 17 21:42 ca-key.pem
    -rw-r--r-- 1 systemd-coredump systemd-coredump     1112 дек 17 21:42 ca.pem
    -rw-r--r-- 1 systemd-coredump systemd-coredump     1112 дек 17 21:42 client-cert.pem
    -rw------- 1 systemd-coredump systemd-coredump     1680 дек 17 21:42 client-key.pem
    -rw-r----- 1 systemd-coredump systemd-coredump        2 дек 17 21:54 ed50eca9e01e.pid
    -rw-r----- 1 systemd-coredump systemd-coredump  6093953 дек 17 21:54 general.log
    -rw-r----- 1 systemd-coredump systemd-coredump      445 дек 17 21:49 ib_buffer_pool
    -rw-r----- 1 systemd-coredump systemd-coredump 79691776 дек 17 21:54 ibdata1
    -rw-r----- 1 systemd-coredump systemd-coredump 50331648 дек 17 21:54 ib_logfile0
    -rw-r----- 1 systemd-coredump systemd-coredump 50331648 дек 17 21:42 ib_logfile1
    -rw-r----- 1 systemd-coredump systemd-coredump 12582912 дек 17 21:54 ibtmp1
    drwxr-x--- 2 systemd-coredump systemd-coredump     4096 дек 17 21:47 laravel
    drwxr-x--- 2 systemd-coredump systemd-coredump     4096 дек 17 21:42 mysql
    drwxr-x--- 2 systemd-coredump systemd-coredump     4096 дек 17 21:42 performance_schema
    -rw------- 1 systemd-coredump systemd-coredump     1680 дек 17 21:42 private_key.pem
    -rw-r--r-- 1 systemd-coredump systemd-coredump      452 дек 17 21:42 public_key.pem
    -rw-r--r-- 1 systemd-coredump systemd-coredump     1112 дек 17 21:42 server-cert.pem
    -rw------- 1 systemd-coredump systemd-coredump     1680 дек 17 21:42 server-key.pem
    drwxr-x--- 2 systemd-coredump systemd-coredump    12288 дек 17 21:42 sys
    

    最重要的是,权限错误消失了。

    【讨论】:

    • 这是 Docker 上最好的功能之一,我曾经遇到过同样的问题,但现在卷已经解决了,谢谢!
    【解决方案2】:

    我也遇到过这个问题,但原因可能与这里的大多数人不同,我想为那些在同一条船上的人省去一些挫败感。

    我有双重引导,并且我的 docker 映像和代码位于 NTFS-3G 驱动器上。我用 chmod 和 chown 尝试了所有肮脏的技巧,但它不起作用。

    当一分钱下降 NTFS-3G 导致问题时,我将 Docker 移回默认配置。图像和容器然后位于/var/lib/docker 和我的代码,我移动到~/code/project

    现在它在容器运行后再次以正常的权限飞行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2020-10-23
      • 2021-01-09
      • 2023-03-22
      • 1970-01-01
      • 2022-06-23
      相关资源
      最近更新 更多