Невозможно создать контейнер 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. Изменены разрешения для /каталога dataна777
  4. Изменено право собственности с ubuntuнаroot
  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, который не существует в контейнере snap, в котором запущен docker, поэтому docker пытается (и не может) создать его.

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

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

Связанный контент