【问题标题】:Docker in VirtualBox cannot access shared foldersVirtualBox 中的 Docker 无法访问共享文件夹
【发布时间】:2020-08-10 05:20:30
【问题描述】:

主机操作系统:macOS Catalina 来宾操作系统:Ubuntu Server 20.04

嗨, 我真的在这里挠头。我正在我的文件服务器上设置一个 Docker VM。我的主 Docker 服务器在本地运行 Ubuntu Server。不幸的是,我需要使用一些 Docker 容器,这些容器需要存储在我的文件服务器上。这是 2008 年的 Mac Pro,因此无法使用 Docker for Mac。 Docker Toolbox 也不行。所以我只是去掉了中间人,手动创建了一个 Linux VM 并在其中运行 Docker。现在,Docker 运行良好,但容器无法写入我在 VirtualBox 中设置的共享文件夹。

我已经安装了 Guest Additions。我已让我的用户成为 vboxsf 组的成员(以及 docker 组,因此我不必对与 Docker 相关的所有内容都使用 sudo)。我可以使用 nano 或我需要的任何工具从 VM 机器上很好地读取和写入共享文件夹,并且 Docker 本身可以在运行 docker-compose up -d 时创建它需要的任何目录......它只是 Docker 容器可以不要写信给它。是否使用 sudo 运行 docker-compose 没有区别。

现在,我正在运行 Portainer、Bazarr、Radarr、Sonarr、Syslog-ng,一旦我让其余的能够写入共享文件夹,我将运行 BackupPC 或 UrBackup。我的大部分容器都在我的专用 Docker 机器上运行,但那些需要访问大量存储空间的容器将在这台机器上。

VirtualBox 在我的用户帐户下运行。文件夹的权限是 755。我不知道为什么他们不能写。有什么想法吗?

谢谢

20 年 8 月 11 日编辑: 我已经改变了一些东西,Portainer 在几次打嗝后开始工作。然后我发现你可以将 docker 的 API 设置为从远程 Portainer 进行监控,所以我删除了那个。看来 Docker 本身可以很好地使用它们……是容器有问题。绑定映射正确完成。但容器无法看到这些文件夹中的内容,也无法写入它们。

此时,我只使用 Bazarr、Radarr 和 Sonarr,因为它们非常相似,否则我只会使用一个容器。它们现在正在运行,因为我已将它们的 /config 文件夹映射到 VM 中的文件夹。但是为了让他们访问存储阵列,我仍然必须使用共享文件夹,而且他们似乎无法跨越 2 个虚拟化级别。 Docker > Ubuntu Server 客户操作系统 > macOS Catalina 主机操作系统。

按要求编辑 2: 这是我的 docker-compose.yml 文件。注释掉的容器就是这样,因为我试图一次只做一件事。没有注释掉的三个是如此相似,以至于它们可能是一个,所以我想如果一个突然开始工作而其他人没有,这可能会帮助我弄清楚。

version: "3.7"

networks:
  docker:
    name: DockerBridge
    driver: bridge

services:
############################# NetData
  # netdata:
  #   image: netdata/netdata
  #   container_name: NetData
  #   hostname: azeroth.local
  #   ports:
  #     - 19999:19999
  #   environment:
  #     PUID: ${PUID}
  #     PGID: ${PGID}
  #     TZ: ${TZ}
  #     DOCKER_HOST: proxy:2375
  #   restart: unless-stopped
  #   cap_add:
  #     - SYS_PTRACE
  #   security_opt:
  #     - apparmor:unconfined
  #   volumes:
  #     - /etc/passwd:/host/etc/passwd:ro
  #     - /etc/group:/host/etc/group:ro
  #     - /proc:/host/proc:ro
  #     - /sys:/host/sys:ro
  #     - /etc/os-release:/host/etc/os-release:ro
  #     - ${USERDIR}/netdata/lib:/var/lib/netdata
  #     - ${USERDIR}/netdata/cache:/var/cache/netdata
  #     - ${USERDIR}/netdata/config:/etc/netdata
  #     - ${USERDIR}/nginx/letsencrypt/live:/ssl:ro
  #   network_mode: bridge
  #   depends_on:
  #     - proxy
  # proxy:
  #   image: tecnativa/docker-socket-proxy
  #   container_name: DockerProxy
  #   environment:
  #     PUID: ${PUID}
  #     PGID: ${PGID}
  #     TZ: ${TZ}
  #     CONTAINERS: 1
  #   volumes:
  #     - /var/run/docker.sock:/var/run/docker.sock:ro
  #   network_mode: bridge

############################# Bazarr
  bazarr:
    image: linuxserver/bazarr
    container_name: Bazarr
    environment:
      PUID: ${PUID}
      PGID: ${PGID}
      TZ: ${TZ}
      UMASK_SET: 022 #optional
    volumes:
      - ${USERDIR}/Docker/Bazarr:/config
      - ${MEDIADIR}/Movies:/movies
      - ${MEDIADIR}/TV\ Shows:/tv
    ports:
      - 6767:6767
    restart: unless-stopped
    networks:
      - docker

############################# Radarr
  radarr:
    image: linuxserver/radarr
    container_name: Radarr
    environment:
      PUID: ${PUID}
      PGID: ${PGID}
      TZ: ${TZ}
      UMASK_SET: 022 #optional
    volumes:
      - ${USERDIR}/Docker/Radarr:/config
      - ${MEDIADIR}/Movies:/movies
      - ${MEDIADIR}/Downloads:/downloads
    ports:
      - 7878:7878
    restart: unless-stopped
    networks:
      - docker

############################# Sonarr
  sonarr:
    image: linuxserver/sonarr
    container_name: Sonarr
    environment:
      PUID: ${PUID}
      PGID: ${PGID}
      TZ: ${TZ}
      UMASK_SET: 022 #optional
    volumes:
      - ${USERDIR}/Docker/Sonarr:/config
      - ${MEDIADIR}/TV\ Shows:/tv
      - ${MEDIADIR}/Downloads:/downloads
    ports:
      - 8989:8989
    restart: unless-stopped
    networks:
      - docker

############################# syslog-ng
  # syslog-ng:
  #   image: balabit/syslog-ng:latest
  #   container_name: Syslog-ng
  #   ports:
  #       - 514:514/udp
  #       - 601:601/tcp
  #       - 6514:6514/tcp
  #   environment:
  #       PUID: ${PUID}
  #       PGID: ${PGID}
  #       TZ: ${TZ}
  #   volumes:
  #       - ${HOSTDIR}/Docker/Syslog-ng/syslog-ng.conf:/etc/syslog-ng/syslog-ng.conf
  #       - ${HOSTDIR}/Docker/Syslog-ng/logs:/var/log
  #   restart: always
  #   networks:
  #     - docker

这是 .env 文件,部分内容已编辑:

PUID=1000
PGID=1000
TZ=America/New_York
USERDIR=/home/scott/Docker
BACKUPDIR=/media/sf_Backup
HOSTDIR=/media/sf_Host
MEDIADIR=/media/sf_Media
DOMAIN=xxxxxxxx.us
EMAIL=xxxxxxxx@xxxxx.com

VirtualBox 有 3 个共享文件夹。

    1. 备份映射到 /Volumes/Backup
    1. 主机映射到 /Users/scott
    1. 媒体映射到 /Volumes/Media

#1 将用于容器化 BackupPC,一旦我完成了其余的工作,并将成为我所有计算机的备份。因此,它尚未使用。

#2 来自较早的设置,我将 /config 目录也映射到共享文件夹。我意识到我不需要那个,但还没有删除 VirtualBox 中的共享文件夹。

#1 是外部 eSata ZFS 池。目前一个 6TB 的驱动器设置了池,可以根据需要轻松添加更多驱动器。

#2 映射到我在主 SSD 上的 macOS 主文件夹。

#3 是一个 5 个 4TB 硬盘驱动器 ZFS 阵列,其中一个驱动器具有奇偶性,容量为 16TB。这个和备份池有差异的原因是这个数组大部分还是空的。

【问题讨论】:

  • 哪个用户(在 docker 中)尝试写入这些文件夹?
  • 我的默认(也是唯一)用户。我将自己添加到 docker 组,这样我就可以运行 docker 而无需使用 sudo。
  • 当您说“无法写入”时,您的意思是文件没有显示出来还是您实际上遇到了某种错误?如果有,是哪一个?如果您映射一个完全不同的非共享目录,docker 实例是否能够写入该目录?
  • @ScottTucker:不,这与运行 docker 守护进程的用户无关。我的意思是在您的容器内操作的用户。通常,它是root。如果是这种情况,请确保 root 有权写入这些文件夹。在某些情况下,使用root 操作时不允许写入(出于安全原因。我也遇到过公司管理员阻止与用户root 写入共享文件夹的情况)。顺便说一句:您可以通过调用命令whoami(例如在您的入口点脚本中)来检查您的用户。
  • @ScottTucker:使用 Microsoft Windows 10 Enterprise 作为主机、Ubuntu 18.04 作为 VM(使用 Virtual Box 6.1)和 ubuntu:latest (18.04) 作为 docker 镜像(使用 docker 19.03.8)。 Window 的 Document 文件夹在我的 VM 中映射到 /media/sf_Documents/ 并通过 -v 标志映射到 docker 容器。完整命令:docker run -it -v /media/sf_Documents/:/shared ubuntu:latest bash

标签: docker docker-compose virtualbox


【解决方案1】:

我已经测试了您的设置,但找不到任何问题。我的设置:

设置

首先:在运行时是否使用sudo 启动容器没有区别。默认情况下,Unix 套接字归用户root 所有,其他用户只能使用sudo 访问它。Docker 守护进程始终以root 用户身份运行。来源:here

  • 主持人:
    • Microsoft Windows 10 企业版
  • 虚拟机(使用 Virtual Box 6.1.2)
    • Ubuntu 20.04.1 LTS
  • Docker 安装
    • Docker 版本 19.03.8,构建 afacb8b7f0
    • docker-compose 版本 1.26.0,构建 d4451659

Docker 文件

我正在调用一个包含以下内容的文件夹

developer@appdev:~/tmp$ ls -l
total 16
drwxrwxr-x  2 developer developer 4096 Aug 14 08:59 .
drwxrwx--- 11 developer developer 4096 Jul 29 09:50 ..
-rw-rw-r--  1 developer developer  261 Aug 14 08:23 docker-compose.yaml
-rw-rw-r--  1 developer developer  111 Aug 14 08:17 .env

docker-compose.yaml 文件

sonarr:
    image: linuxserver/sonarr
    container_name: Sonarr
    environment:
      PUID: ${PUID}
      PGID: ${PGID}
      UMASK_SET: 022 #optional
    volumes:
      - ${HOSTDIR}/testdir:/Documents
    ports:
      - 8989:8989
    restart: unless-stopped

.env 文件

PUID=1000
PGID=1000
TZ=America/New_York
HOSTDIR=/media/sf_Documents
DOMAIN=xxxxxxxx.us
EMAIL=xxxxxxxx@xxxxx.com

Virtual Box 的共享文件夹

我的共享文件夹映射到/media/sf_Documents

developer@appdev:~$ ls -l /media/
total 8
drwxrwx---  1 root vboxsf 4096 Aug 12 09:01 sf_Documents

文件夹 sf_Dockument 包含一个文件夹 testdir 已由主机 (Windows) 创建

测试

为了测试,我使用

查看了 docker-file
docker-compose up

并让它运行。使用 bash 交互进入容器:

docker exec -it Sonarr bash

尝试使用cd Documents/touch testmkdir mytestdir 添加文件。一个ls -l 输出以下内容

total 4
drwxrwx--- 1 root  998    0 Aug 14 07:08 .
drwxr-xr-x 1 root root 4096 Aug 14 06:23 ..
drwxrwx--- 1 root  998    0 Aug 14 07:08 mytestdir
-rwxrwx--- 1 root  998    0 Aug 14 06:24 test

powershell dir 调用按预期输出文件。

PS D:\UserData\***\Documents\testdir> dir


    Verzeichnis: D:\UserData\***\Documents\testdir


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       14.08.2020     09:08                mytestdir
-a----       14.08.2020     08:24              0 test

缩小问题范围的建议

由于我无法重现您的问题,我想给您一些我会尝试的建议:

  • 挂载另一个不是共享文件夹的文件夹(例如 /home/)并尝试是否可以从 docker-container 写入。

由于我不使用 Mac OS 作为主机系统,我无法验证这一点。也许您的主机存在权限问题。

  • 是否可以从 VM(不是 docker!)写入共享文件夹?尝试将文件或文件夹添加到共享文件夹并检查是否可以写入。
  • 检查 Virtual Box 是否可以写入或读取您映射到 VM 的文件夹。检查要映射到 VM 的文件夹的权限。
  • 如果您错误地勾选了 只读,请检查 Virtual-Box Shared-Folders-Settings

【讨论】:

  • 感谢您提供有关 Unix 套接字的信息。那讲得通!第二个共享文件夹 HOSTDIR 被列为未使用,因为我试图放入其中的所有内容,我最终都放入了 VM 中的另一个文件夹,它完美地工作。我可以毫无问题地从 VM 本身写入共享文件夹。此外,当我运行 docker-compose up 时,会创建任何不存在的子目录。但是一旦容器启动,写访问就结束了。好像只有容器不能写,VM和docker-compose都可以。
  • 另外,容器看不到文件夹中的内容。他们看到了我在卷部分设置的映射,但他们看不到任何已经存在的文件。整个事情让我很困惑。我可能会看看我是否可以试用 VMWare Fusion 来排除 VirtualBox。
  • 您的映射是否正确完成(映射路径中的拼写错误,可能是可能导致问题的隐藏字符或空格等)。听起来 docker 正在尝试映射一个不存在的文件夹。如果映射的文件夹路径无效,Docker 在某些情况下并不总是因错误而停止。
  • 好主意!这就是问题所在。在交互模式下,我看到了一个 /files 目录。那不应该还在那里。这是我删除的旧共享。似乎当它们被重新创建而不是被拆除和备份时,它们也保留了旧地图。无论如何,所有其他映射都在那里,电视被列为“电视\节目”。我使用了错误的语法来转义空格。不管怎样,我评论了电视音量,然后把所有东西都恢复了。现在在 docker exec -it 中,我可以看到一切,也可以写。谢谢您的帮助!逃离那个空间的正确方法是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2011-07-15
  • 2017-12-16
相关资源
最近更新 更多