podman unshare コマンドを使ってコンテナから作成したファイルのパーミッション問題を解決する

create
2021年10月04日
update
2021年10月04日

🍵はじめに

前提

ルートレスモードの Podman では、ユーザ名前空間という仕組みによって実行ユーザーのUIDがコンテナ内の root としてマッピングされる。
これにより、ホスト側のディレクトリをコンテナにマウントしたときに、コンテナ側でファイルを作成してもパーミッションの問題に悩まされることなく利用できる。

問題

コンテナ側の root ではない一般ユーザーによってファイル作成された場合、ホスト側からファイル操作しようとするとパーミッションの問題が発生する。

対策

ファイル操作用のコンテナを起動しなくても、podman unshare コマンドが使えるかも。

Table 1. 環境
App Version

podman

3.0.1

この記事では ルートレスモード を前提にしています。

🚨問題のファイルパーミッション

コンテナ側の一般ユーザーで作成したファイルをホスト側から見ると下記のようになる。

Example 1. コンテナ側で一般ユーザーが作成したファイル
ホスト側からではパーミッションが問題になる
ls -An README.md
-rw-r--r-- 1 166536 166536 3584 Aug 30 00:10 README.md  (1)

echo 'hello' >> README.md   (2)
-bash: README.md: Permission denied
1 UID, GID の値が Podman によるマッピング後の値になっている。
2 当然、上書きしようとするとパーミッションで拒否される。

このように、ホスト側からファイル操作したいのにパーミッションの問題が発生している場合、podman unshare コマンドを用いると解決できる。

🚀 podman unshare COMMAND

COMMANDPodman が扱うユーザ名前空間内で実行する。

コンテナ側の一般ユーザーで作成したファイルを、ホスト側で編集したいときに利用できる。

podman unshare -- id
uid=0(root) gid=0(root) groups=0(root),65534(nogroup)   (1) (2)
podman unshare -- ls -An README.md
-rw-r--r-- 1 1001 1001 3584 Aug 30 00:10 README.md      (1)

podman unshare -- nano README.md
1 コンテナで使われているユーザ名前空間上において操作できる。
2 podman unshare に渡したコマンドは root として実行される。
👉ルートレス Podman において、実行ユーザーは root にマッピングされるため。
-- はあってもなくてもいい。
例では見た目がわかりやすいかなと思ってつけている。

😎おわりに

コンテナ側で生成されたファイルをちょっと編集したくなったとき、いちいちコンテナを起動する必要性がなくなって助かる🤗。

もっとも、こういうめったに使わないけど知っておくと便利なコマンドって、作業が終わってから見つかるんだけど。
ぴえん🥺。