No se puede crear un contenedor Docker con un volumen montado desde un directorio creado por el usuario en la raíz de un host Ubuntu (EC2)

No se puede crear un contenedor Docker con un volumen montado desde un directorio creado por el usuario en la raíz de un host Ubuntu (EC2)

Quiero crear un contenedor Docker que tenga un volumen montado desde un directorio creado por el usuario en la raíz del host Docker. El host es una instancia EC2 de Ubuntu.

El error

Me gustaría montar el /datadirectorio siguiente en un contenedor Docker, pero aparece el error:

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.

El mismo comando funciona si uso un directorio que viene con la instancia (por ejemplo /usr):

ubuntu:~$ docker run -it --rm -v /usr:/data alpine 
/ # ls /data
bin      games    include  lib      lib32    local    sbin     share    src

información adicional

Recibo el mismo error, incluso si hago lo siguiente:

  1. Usando --mounten lugar de -v, incluso con la readonlyopción.
  2. Ejecute el comando anterior con sudo.
  3. Se cambiaron los permisos en /un datadirectorio a777
  4. Cambió de propietario de ubuntuaroot
  5. Monte un subdirectorio como /data/subdir.

El dfcomando indica que no hay montajes especiales en la raíz de la instancia:

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

El demonio acoplable se ejecuta como 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

Gracias de antemano. Este es un problema desconcertante y hubiera pensado que sería fácil en Docker y AWS/EC2.

Respuesta1

Nota:Esta respuesta se aplica sólo a Ubuntu (y, hasta cierto punto, a las distribuciones derivadas). No debe aplicarse a ninguna otra distribución.

La causa principal del problema es que instaló y ejecutó Docker en un abrir y cerrar de ojos, y la mayoría de las personas no deberían ejecutarlo de esta manera. Cuando se inicia un programa confinado por snap, snapd crea un contenedor para ejecutar el programa, y ​​solo los archivos a los que se podía acceder cuando se inició el programa serán accesibles para el programa. Esto incluye su nuevo directorio /data, que no existe en el contenedor instantáneo en el que se ejecuta Docker, razón por la cual Docker intenta (y falla) crearlo.

La versión de Docker incluida con Ubuntu tampoco debe usarse, ya que no se mantiene actualizada. (Realmente deberían mantenerlo actualizado o eliminarlo por completo, pero no cuenten con que cualquiera de las dos cosas suceda pronto).

La mayoría de la gente debería usarDocker de los repositorios oficiales de Dockerpara evitar una amplia variedad de problemas que surgen con los paquetes acoplables de Ubuntu.

información relacionada