VirtualBox中的Docker无法访问共享文件夹

时间:2020-08-10 05:20:30

标签: docker docker-compose virtualbox

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

嗨, 我真的在这里挠头。我正在文件服务器上设置Docker VM。我的主要Docker服务器本机运行Ubuntu Server。不幸的是,有一些我需要使用的Docker容器需要存储在文件服务器上。这是2008年的Mac Pro,因此无法使用Mac版Docker。 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。我无法弄清为什么它们不能写。有什么想法吗?

谢谢

编辑8/11/20: 经过几次打started之后,Poortainer我做了些改动。然后我发现您可以将Docker的API设置为从远程Portainer进行监视,因此我删除了该API。似乎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是一个5TB 4TB硬盘ZFS阵列,具有一个奇偶校验驱动器,容量为16TB。此备份池与备份池之间存在差异的原因是该阵列仍然大部分为空。

1 个答案:

答案 0 :(得分:0)

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

设置

第一:是否使用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 包含由主机(Windows)创建的文件夹testdir

测试

为了进行测试,我使用

标记了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共享文件夹设置