Ubuntu ホスト (EC2) のルートにあるユーザー作成ディレクトリからマウントされたボリュームを持つ Docker コンテナを作成できません

Ubuntu ホスト (EC2) のルートにあるユーザー作成ディレクトリからマウントされたボリュームを持つ Docker コンテナを作成できません

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の代わりにを使用します。-vreadonly
  2. 上記のコマンドを で実行しますsudo
  3. ディレクトリの権限を次のように/変更しましたdata777
  4. 所有権を から に変更しましubunturoot
  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 はプログラムを実行するためのコンテナーを作成し、プログラムが起動したときにアクセス可能だったファイルのみがプログラムからアクセス可能になります。これには、/datadocker が実行されている snap コンテナーには存在しない新しいディレクトリが含まれます。そのため、docker はそれを作成しようとしますが、失敗します。

Ubuntu 自体に同梱されている docker のバージョンも、最新版に更新されていないため、使用しないでください。(Ubuntu は、docker を最新の状態に保つか、完全に削除する必要がありますが、どちらもすぐに実行されるとは期待しないでください。)

ほとんどの人は公式DockerリポジトリからのDockerUbuntu の Docker パッケージで発生するさまざまな問題を回避するためです。

関連情報