ボリュームマウントのパーミッション管理
Docker ボリュームを使用すると、ホストとコンテナ間でデータを共有できます。ただし、ボリュームを使用する際にパーミッションを正しく管理することは、問題を回避するために重要です。このステップでは、ボリュームマウントを使用する際のパーミッションの扱い方を学びます。
ボリュームマウントのパーミッション問題の理解
Docker ボリュームマウントに関する主な問題は、コンテナ内のユーザー ID がホストシステムのユーザー ID と一致しない場合があることです。これにより、マウントされたボリューム内のファイルにアクセスする際にパーミッション問題が発生する可能性があります。
この問題を簡単な例で説明しましょう。
まず、コンテナにマウントするホスト上の新しいディレクトリを作成します。
mkdir -p ~/project/host-data
cd ~/project/host-data
このディレクトリにテストファイルを作成します。
echo "This is a test file created on the host" > host-file.txt
このファイルの所有権を確認します。
ls -l host-file.txt
ファイルが labex
ユーザー(ホスト上の現在のユーザー)によって所有されていることがわかるはずです。
-rw-r--r-- 1 labex labex 39 May 15 13:00 host-file.txt
次に、このディレクトリをマウントするコンテナを実行し、ファイルを変更してみましょう。
docker run -it --rm -v ~/project/host-data:/container-data ubuntu:22.04 bash
これでコンテナ内に入りました。マウントされたファイルの所有権を確認しましょう。
ls -l /container-data/host-file.txt
次のような出力が表示されることがあります。
-rw-r--r-- 1 1000 1000 39 May 15 13:00 /container-data/host-file.txt
コンテナはホストの labex
ユーザーについて知らないため、ファイルはユーザー名ではなく数値 ID で表示されていることに注意してください。
マウントされたディレクトリに新しいファイルを作成してみましょう。
echo "This is a test file created in the container" > /container-data/container-file.txt
この新しいファイルの所有権を確認します。
ls -l /container-data/container-file.txt
次のように表示されるはずです。
-rw-r--r-- 1 root root 47 May 15 13:05 /container-data/container-file.txt
ファイルはコンテナ内の root
ユーザーによって所有されています(デフォルトで root として実行されているため)。
コンテナを終了します。
exit
次に、ホスト上の両方のファイルの所有権を確認します。
ls -l ~/project/host-data/
コンテナ内から作成されたファイルがホスト上で root
によって所有されていることがわかります。
-rw-r--r-- 1 root root 47 May 15 13:05 container-file.txt
-rw-r--r-- 1 labex labex 39 May 15 13:00 host-file.txt
ホスト上の非 root ユーザーがこれらのファイルにアクセスまたは変更する必要がある場合、これによりパーミッション問題が発生する可能性があります。
ボリュームのパーミッション問題の解決方法
ボリュームのパーミッション問題を解決する方法はいくつかあります。いくつかの一般的なアプローチを見てみましょう。
アプローチ 1: Dockerfile でユーザーをホストユーザーに一致させる
この例用の新しいディレクトリを作成します。
mkdir -p ~/project/volume-permissions
cd ~/project/volume-permissions
新しい Dockerfile を作成します。
nano Dockerfile
以下の内容を追加します。
FROM ubuntu:22.04
## ホストユーザーと同じ UID のユーザーを作成する
RUN useradd -m -u 1000 appuser
## アプリケーションディレクトリを作成し、所有権を設定する
RUN mkdir -p /app/data && chown -R appuser:appuser /app
## 作業ディレクトリを設定する
WORKDIR /app
## appuser に切り替える
USER appuser
## 実行するコマンド
CMD ["bash", "-c", "echo 'I can write to the mounted volume' > /app/data/test.txt && tail -f /dev/null"]
エディタを保存して終了します。
イメージをビルドします。
docker build -t volume-permissions-image .
テスト用のホストディレクトリを作成します。
mkdir -p ~/project/volume-permissions/host-data
ボリュームをマウントしたコンテナを実行します。
docker run -d --name volume-test -v ~/project/volume-permissions/host-data:/app/data volume-permissions-image
しばらくしてから、ホスト上で作成されたファイルの所有権を確認します。
ls -l ~/project/volume-permissions/host-data/
ファイルが UID 1000 のユーザーによって所有されていることがわかるはずです。これはホストユーザーの UID と一致するはずです。
-rw-r--r-- 1 labex labex 35 May 15 13:15 test.txt
このアプローチが機能するのは、コンテナ内にホストユーザーと同じ UID のユーザーを作成したからです。
アプローチ 2: --user フラグを使用する
もう 1 つのアプローチは、コンテナを実行する際に使用するユーザー ID を指定するために --user
フラグを使用することです。
まず、前のコンテナをクリーンアップします。
docker stop volume-test
docker rm volume-test
次に、--user
フラグを使用してコンテナを実行します。
docker run -d --name user-flag-test --user "$(id -u):$(id -g)" -v ~/project/volume-permissions/host-data:/data ubuntu:22.04 bash -c "echo 'Created with --user flag' > /data/user-flag-test.txt && sleep 3600"
このコマンドは、現在のユーザー ID とグループ ID でコンテナを実行します。
新しいファイルの所有権を確認します。
ls -l ~/project/volume-permissions/host-data/user-flag-test.txt
ファイルがホストユーザーによって所有されていることがわかるはずです。
-rw-r--r-- 1 labex labex 23 May 15 13:20 user-flag-test.txt
次のステップに進む前にクリーンアップしましょう。
docker stop user-flag-test
docker rm user-flag-test
これらのアプローチは、Docker ボリュームを使用する際のパーミッションの管理方法を示しています。コンテナとホスト間のユーザー ID を一致させることで、データを共有する際のパーミッション問題を回避できます。