Não é possível criar um contêiner Docker com um volume montado a partir de um diretório criado pelo usuário na raiz de um host Ubuntu (EC2)

Não é possível criar um contêiner Docker com um volume montado a partir de um diretório criado pelo usuário na raiz de um host Ubuntu (EC2)

Quero criar um contêiner Docker que tenha um volume montado a partir de um diretório criado pelo usuário na raiz do host Docker. O host é uma instância do Ubuntu EC2.

O erro

Gostaria de montar o /datadiretório abaixo em um contêiner Docker, mas recebo o erro mostrado:

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.

O mesmo comando funciona se eu usar um diretório que acompanha a instância (por exemplo /usr):

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

Informações adicionais

Recebo o mesmo erro, mesmo se fizer o seguinte:

  1. Usando --mountem vez de -v, mesmo com a readonlyopção.
  2. Execute o comando acima com sudo.
  3. Alteradas as permissões /e datadiretório para777
  4. Propriedade alterada de ubuntupararoot
  5. Monte um subdiretório como /data/subdir.

O dfcomando indica que não há montagens especiais na raiz da instância:

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

O daemon docker está sendo executado 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

Desde já, obrigado. Este é um problema incômodo e eu teria pensado que seria fácil no Docker e no AWS/EC2.

Responder1

Observação:Esta resposta se aplica apenas ao Ubuntu (e até certo ponto às distribuições derivadas). Não deve ser aplicado a nenhuma outra distro.

A causa raiz do problema é que você instalou e executou o Docker rapidamente, e a maioria das pessoas não deveria executá-lo dessa maneira. Quando um programa confinado pelo snap é iniciado, o snapd cria um contêiner para executar o programa, e somente os arquivos que estavam acessíveis quando o programa foi iniciado estarão acessíveis ao programa. Isso inclui seu novo diretório /data, que não existe no contêiner snap em que o docker está sendo executado, e é por isso que o docker tenta (e falha) em criá-lo.

A versão do docker que acompanha o Ubuntu também não deve ser usada, pois não é mantida atualizada. (Eles realmente deveriam mantê-lo atualizado ou abandoná-lo completamente, mas não espere que isso aconteça tão cedo.)

A maioria das pessoas deveria usarDocker dos repositórios oficiais do Dockerpara evitar uma grande variedade de problemas que surgem nos pacotes docker do Ubuntu.

informação relacionada