Рейтинг:1

Не удается создать контейнер Docker с томом, смонтированным из созданного пользователем каталога в корне узла Ubuntu (EC2)

флаг in

Я хочу создать контейнер Docker с томом, смонтированным из созданного пользователем каталога в корневом каталоге хоста Docker. Хост — это экземпляр Ubuntu EC2.

Ошибка

Я хотел бы смонтировать /данные каталог ниже в контейнере Docker, но я получаю сообщение об ошибке:

убунту:~$ лс -л /
всего 120
drwxr-xr-x 25 root root 4096 10 августа 20:51 ./
drwxr-xr-x 25 root root 4096 10 августа 20:51 ../
drwxr-xr-x 2 root root 4096 22 июля 13:50 бин/
drwxr-xr-x 3 root root 4096 22 июля 13:50 загрузка/
drwxr-xr-x 4 ubuntu ubuntu 4096 10 августа 19:58 данные/
...
drwxr-xr-x 8 root root 4096 30 мая 12:19 домой/
...
drwxr-xr-x 3 root root 4096 20 июня 13:39 мин/
...
drwxr-xr-x 12 root root 4096 12 июня 01:03 usr/
ubuntu:~$ docker run -it --rm -v /data:/data alpine
docker: Ответ об ошибке от демона: ошибка при создании исходного пути монтирования '/data': mkdir/data: файловая система только для чтения.

Та же команда работает, если я использую каталог, поставляемый с экземпляром (например, /usr):

ubuntu:~$ docker run -it --rm -v /usr:/data alpine 
/ # лс /данные
bin игры включают lib lib32 local sbin share src

Дополнительная информация

Я получаю ту же ошибку, даже если я делаю следующее:

  1. С использованием --устанавливать вместо -v, даже с только для чтения вариант.
  2. Выполните команду выше с судо.
  3. Изменены разрешения на / и данные каталог для 777
  4. Изменился владелец с убунту к корень
  5. Смонтируйте подкаталог, например /данные/подкаталог.

дф указывает, что в корне экземпляра нет специальных монтирований:

убунту:~$ df -h
Используемый размер файловой системы Доступно Использование % Установлено на
udev 7.9G 0 7.9G 0% /dev
tmpfs 1.6G 872K 1.6G 1%/запуск
/dev/xvda1 194 ГБ 180 ГБ 14 ГБ 93% /
tmpfs 7.9G 0 7.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /выполнить/заблокировать
tmpfs 7.9G 0 7.9G 0% /sys/fs/cgroup
/dev/loop0 132M 132M 0 100% /привязка/докер/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% /мнт/с3
tmpfs 1.6G 0 1.6G 0% /выполнить/пользователь/1000

Демон docker работает от имени root:

ubuntu:~/$ ps -ef | grep докерд
корень 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
корень 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
флаг cz

Примечание: Этот ответ относится только к Ubuntu (и, в некоторой степени, к производным дистрибутивам). Его не следует применять ни к какому другому дистрибутиву.

Основная причина проблемы заключается в том, что вы установили и запустили Docker как оснастку, и большинству людей не следует запускать его таким образом. Когда программа, ограниченная snap, запускается, snapd создает контейнер для запуска программы, и только файлы, которые были доступны при запуске программы, будут доступны для программы. Это включает в себя ваш новый каталог /данные, которого нет в snap-контейнере, в котором работает docker, поэтому docker пытается (и не может) его создать.

Версию докера, поставляемую с самой Ubuntu, также не следует использовать, так как она не обновляется. (Они действительно должны либо обновлять его, либо полностью отказаться от него, но не рассчитывайте, что это произойдет в ближайшее время.)

Большинство людей должны использовать Docker из официальных репозиториев Docker чтобы избежать множества проблем, возникающих с пакетами докеров Ubuntu.

флаг in
Это очень полезно. Когда вы сказали: «Когда запускается программа, ограниченная snap, snapd создает контейнер для запуска программы», я надеялся, что если я перезагружусь, Docker увидит новый каталог (например, / data). Однако это не так. Однако это работает, если я помещаю каталог в /mnt (например, /mnt/data). Почему это? Есть ли что-нибудь, что я могу прочитать, чтобы помочь мне понять?
Michael Hampton avatar
флаг cz
@mherzog Я думаю, что у snap есть определенный список каталогов, которые он будет отображать для содержащейся программы. Но, как правило, я избегаю снэпа.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.