%20%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%88%E3%81%AB%E3%81%82%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E4%BD%9C%E6%88%90%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%95%E3%82%8C%E3%81%9F%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%82%92%E6%8C%81%E3%81%A4%20Docker%20%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E4%BD%9C%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93.png)
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
追加情報
以下の操作を実行しても同じエラーが発生します。
- オプションを使用する場合でも、
--mount
の代わりにを使用します。-v
readonly
- 上記のコマンドを で実行します
sudo
。 - ディレクトリの権限を次のように
/
変更しましたdata
777
- 所有権を から に変更しまし
ubuntu
たroot
- などのサブディレクトリをマウントします
/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
docker が実行されている snap コンテナーには存在しない新しいディレクトリが含まれます。そのため、docker はそれを作成しようとしますが、失敗します。
Ubuntu 自体に同梱されている docker のバージョンも、最新版に更新されていないため、使用しないでください。(Ubuntu は、docker を最新の状態に保つか、完全に削除する必要がありますが、どちらもすぐに実行されるとは期待しないでください。)
ほとんどの人は公式DockerリポジトリからのDockerUbuntu の Docker パッケージで発生するさまざまな問題を回避するためです。