%20bereitgestellt%20wird..png)
Ich möchte einen Docker-Container erstellen, der ein Volume aus einem vom Benutzer erstellten Verzeichnis im Stammverzeichnis des Docker-Hosts gemountet hat. Der Host ist eine Ubuntu EC2-Instanz.
Der Fehler
Ich möchte das /data
unten stehende Verzeichnis in einem Docker-Container mounten, erhalte jedoch die folgende Fehlermeldung:
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.
Derselbe Befehl funktioniert, wenn ich ein Verzeichnis verwende, das mit der Instanz geliefert wurde (z. B. /usr
):
ubuntu:~$ docker run -it --rm -v /usr:/data alpine
/ # ls /data
bin games include lib lib32 local sbin share src
Weitere Informationen
Ich erhalte den gleichen Fehler, auch wenn ich Folgendes mache:
- Verwenden Sie
--mount
anstelle von-v
, auch mit derreadonly
Option. - Führen Sie den obigen Befehl mit aus
sudo
. - Die Berechtigungen für
/
dasdata
Verzeichnis wurden geändert in777
- Eigentümerwechsel von
ubuntu
nachroot
- Mounten Sie ein Unterverzeichnis wie beispielsweise
/data/subdir
.
Der df
Befehl gibt an, dass auf der Stammebene der Instanz keine speziellen Mounts vorhanden sind:
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
Der Docker-Daemon wird als Root ausgeführt:
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
Vielen Dank im Voraus. Dies ist ein ärgerliches Problem und ich hätte gedacht, dass es in Docker und AWS/EC2 einfach wäre.
Antwort1
Notiz:Diese Antwort gilt nur für Ubuntu (und in gewissem Maße abgeleitete Distributionen). Sie sollte nicht auf andere Distributionen angewendet werden.
Die Hauptursache des Problems ist, dass Sie Docker als Snap installiert und ausgeführt haben, und die meisten Leute sollten es nicht auf diese Weise ausführen. Wenn ein durch Snap eingeschränktes Programm gestartet wird, erstellt snapd einen Container, in dem das Programm ausgeführt wird, und nur Dateien, die beim Start des Programms zugänglich waren, sind für das Programm zugänglich. Dazu gehört Ihr neues Verzeichnis /data
, das im Snap-Container, in dem Docker ausgeführt wird, nicht vorhanden ist, weshalb Docker versucht (und scheitert), es zu erstellen.
Die mit Ubuntu mitgelieferte Docker-Version sollte ebenfalls nicht verwendet werden, da sie nicht auf dem neuesten Stand gehalten wird. (Sie sollten sie entweder auf dem neuesten Stand halten oder ganz fallen lassen, aber rechnen Sie nicht damit, dass eines von beiden in naher Zukunft passieren wird.)
Die meisten Menschen solltenDocker aus den offiziellen Docker-Reposum eine Vielzahl von Problemen zu vermeiden, die mit den Docker-Paketen von Ubuntu auftreten.