-uオプションとは
Docker コンテナの実行時に、ユーザーID(UID)およびグループID(GID)を指定するためのオプションです。
-u <UID>:<GID>
ホストの UID/GID を調べるには、以下のコマンドを使います。
id -u
id -g
これを用いることで、コンテナ内のプロセスがホスト側のユーザーと同じ権限で動作し、マウントされたファイルとのパーミッションの整合性が取れます。
docker run -it -u $(id -u):$(id -g) <image> bash
なぜ-uオプションを使う必要があるのか?
Dockerコンテナは初期状態ではrootユーザーとして動作します。
しかし、他のユーザーなどと連携する場合、正しい UID/GID を指定しないと、許可されていないファイル操作が発生したり、セキュリティ上の問題につながるおそれがあります。
そのため、コンテナ内での実行ユーザーを明示的に指定することは、安全性とホスト環境との互換性を確保するために重要です。
よくあるエラー「Permission denied」
ホスト上のディレクトリをボリュームマウントしているときに、以下のような操作をすると
$ touch /new_dir/test
次のようなエラーになることがあります。
touch: cannot touch 'test': Permission denied
コンテナ内のユーザーが /new_dir に対する書き込み権限を持っていないためです。
このようなエラーに対応するのにも-uを使います。
例:ボリュームマウントしたディレクトリへの書き込み
パーミッションの確認
コンテナ内でファイルやディレクトリの所有者やパーミッションを確認するには、ls -lコマンドを使います。
ls -l /new_dir
出力例:
drwxr-xr-x 2 root root 4096 Jun 24 10:52 dir_dockerfile
drwxr-xr-xがパーミッションコードで、 root rootがUIDとGIDです。
パーミッションコード
パーミッションコードは添付画像のように10桁のコードで、1文字目はファイルの種類、その後の3・3・3文字はそれぞれ所有ユーザー、所有グループ、その他ユーザーの権利です。
ファイルの種類は次の表のようになります。
| 記号 | 種類 |
|---|---|
| - | ファイル |
| d | ディレクトリ |
| l | シムリンク |
また、所有ユーザー、所有グループ、その他のユーザーの権利は次の表のようになります。
| 記号 | 権利 |
|---|---|
| r | 読み取り |
| w | 書き込み |
| x | 実行 |
まとめ
-u $(id -u):$(id -g) を使えば、ホストユーザーと同じ権限で操作できるため、セキュリティ面、開発効率面ともにメリットが大きいです。
「とりあえず root」から卒業して、コンテナをより安全に、快適に使いこなしましょう!
