.png)
Я хочу создать контейнер 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
, который не существует в контейнере snap, в котором запущен docker, поэтому docker пытается (и не может) создать его.
Версию docker, поставляемую с Ubuntu, также не следует использовать, поскольку она не обновляется. (Им действительно следовало бы либо обновлять ее, либо полностью отказаться от нее, но не стоит рассчитывать на то, что это произойдет в ближайшее время.)
Большинству людей следует использоватьDocker из официальных репозиториев Dockerчтобы избежать множества проблем, возникающих с пакетами Docker в Ubuntu.