【发布时间】: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 个共享文件夹。
-
- 备份映射到 /Volumes/Backup
-
- 主机映射到 /Users/scott
-
- 媒体映射到 /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