无法创建一个 Docker 容器,该容器的卷从 ubuntu 主机(EC2)根目录中的用户创建的目录挂载

无法创建一个 Docker 容器,该容器的卷从 ubuntu 主机(EC2)根目录中的用户创建的目录挂载

我想创建一个 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

附加信息

即使我执行以下操作,也会收到同样的错误:

  1. 使用--mount而不是-v,甚至带有readonly选项。
  2. 使用 执行上述命令sudo
  3. /将目录的权限更改data777
  4. 所有权从 更改ubunturoot
  5. 挂载一个子目录,例如/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 包出现各种各样的问题。

相关内容