我想创建一个 Docker 容器,该容器的卷从 Docker 主机根目录中的用户创建的目录挂载。主机是 Ubuntu EC2 实例。
错误
我想/data
在 Docker 容器中挂载以下目录,但是出现以下错误:
ubuntu:~$ ls -l /
total 120
drwxr-xr-x 25 root root 4096 Aug 10 20:51 ./
drwxr-xr-x 25 root root 4096 Aug 10 20:51 ../
drwxr-xr-x 2 root root 4096 Jul 22 13:50 bin/
drwxr-xr-x 3 root root 4096 Jul 22 13:50 boot/
drwxr-xr-x 4 ubuntu ubuntu 4096 Aug 10 19:58 data/
...
drwxr-xr-x 8 root root 4096 May 30 12:19 home/
...
drwxr-xr-x 3 root root 4096 Jun 20 13:39 mnt/
...
drwxr-xr-x 12 root root 4096 Jun 12 01:03 usr/
ubuntu:~$ docker run -it --rm -v /data:/data alpine
docker: Error response from daemon: error while creating mount source path '/data': mkdir /data: read-only file system.
如果我使用实例附带的目录(例如/usr
),相同的命令会起作用:
ubuntu:~$ docker run -it --rm -v /usr:/data alpine
/ # ls /data
bin games include lib lib32 local sbin share src
附加信息
即使我执行以下操作,也会收到同样的错误:
- 使用
--mount
而不是-v
,甚至带有readonly
选项。 - 使用 执行上述命令
sudo
。 /
将目录的权限更改data
为777
- 所有权从 更改
ubuntu
为root
- 挂载一个子目录,例如
/data/subdir
。
该df
命令表明实例的根上没有特殊挂载:
ubuntu:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 7.9G 0 7.9G 0% /dev
tmpfs 1.6G 872K 1.6G 1% /run
/dev/xvda1 194G 180G 14G 93% /
tmpfs 7.9G 0 7.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/loop0 132M 132M 0 100% /snap/docker/796
/dev/loop2 25M 25M 0 100% /snap/amazon-ssm-agent/4046
/dev/loop3 56M 56M 0 100% /snap/core18/2128
/dev/loop1 100M 100M 0 100% /snap/core/11316
/dev/loop4 100M 100M 0 100% /snap/core/11420
/dev/loop5 56M 56M 0 100% /snap/core18/2074
/dev/loop6 34M 34M 0 100% /snap/amazon-ssm-agent/3552
s3fs 256T 0 256T 0% /mnt/s3
tmpfs 1.6G 0 1.6G 0% /run/user/1000
docker 守护进程以 root 身份运行:
ubuntu:~/$ ps -ef | grep dockerd
root 964 1 1 19:49 ? 00:00:55 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/snap/docker/796/config/daemon.json
root 1302 1 0 19:49 ? 00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ubuntu 6868 2649 0 21:20 pts/1 00:00:00 grep --color=auto dockerd
提前致谢。这是一个令人烦恼的问题,我原本以为在 Docker 和 AWS/EC2 中很容易解决。
答案1
笔记:此答案仅适用于 Ubuntu(以及某种程度上的衍生发行版)。它不应适用于任何其他发行版。
问题的根本原因是您已将 Docker 安装并作为 snap 运行,而大多数人不应该以这种方式运行它。当 snap 限制的程序启动时,snapd 会创建一个容器来运行该程序,并且只有在程序启动时可访问的文件才可供该程序访问。这包括您的新目录/data
,该目录在 docker 正在运行的 snap 容器中不存在,这就是 docker 尝试(并失败)创建它的原因。
Ubuntu 本身附带的 docker 版本也不应该使用,因为它没有保持更新。(他们确实应该要么保持更新,要么完全放弃它,但不要指望这两种情况很快就会发生。)
大多数人应该使用来自官方 Docker 存储库的 Docker以避免 Ubuntu 的 docker 包出现各种各样的问题。