-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」から卒業して、コンテナをより安全に、快適に使いこなしましょう!