rootless podmanの初期設定
目標
専用ユーザーpodsterのためのrootless podman環境を、最初から構成して、podman infoで検証します。
なぜ重要なのか
rootless podmanは、インストールよりも設定が本題です。/etc/subuidの範囲がないと、単一UIDモードに黙ってフォールバックして、特定のイメージでだけ権限エラーが出て、その原因を探すのに何日もかかります。graphrootを確認しないと、ホームパーティションが埋まって、サービスが止まります。unqualified-search-registriesを入れないと、dockerでうまく動いていたスクリプトが、podmanでイメージを見つけられません。
このラボのチェックリストは、実務で新しいサーバーにrootless podmanを立てるときに、そのまま使う順序です。
ステップ
/root/podディレクトリを作成して、ユーザーpodsterのuid gid 홈경로を(プレースホルダーはホームのパスです)空白で区切って1行で、/root/pod/user.txtに書いてください。/etc/subuidに、podsterへ開始100000、個数65536の範囲を割り当ててください。/etc/subgidにも、同じ範囲を割り当ててください。/root/pod/mapping.txtを、次の3行で作成してください。CONTAINER_0=<컨테이너 안 UID 0 에 대응하는 호스트 UID>/CONTAINER_1=<컨테이너 안 UID 1 의 호스트 UID>/CONTAINER_1000=<컨테이너 안 UID 1000 의 호스트 UID>(プレースホルダーは、順に、コンテナ内のUID 0に対応するホストUID、コンテナ内のUID 1のホストUID、コンテナ内のUID 1000のホストUIDです)/home/podster/.config/containers/storage.confを作成してください。[storage]セクションに、driver、runroot、graphrootの3つのキーがある必要があり、graphrootは/home/podster/.local/share/containers/storageである必要があります。ファイルの所有者はpodsterである必要があります。/home/podster/.config/containers/registries.confを作成してください。unqualified-search-registriesにdocker.ioが含まれている必要があり、docker.ioを社内ミラーmirror.labhub.local/dockerhubへ向ける[[registry]]ブロックがある必要があります。ファイルの所有者はpodsterである必要があります。podsterの権限でpodman infoを実行して、結果を/root/pod/info.jsonとして保存してください。JSON形式である必要があり、graphRootの値が、ステップ5で指定したパスである必要があります。/root/pod/checklist.txtを、次の5行で作成してください。SUBUID=yes/SUBGID=yes/ROOTLESS=<info 의 rootless 값 true/false>/GRAPHROOT=<info 의 graphRoot 값>/DRIVER=<info 의 스토리지 드라이버 이름>(プレースホルダーは、順に、infoのrootlessの値のtrueまたはfalse、infoのgraphRootの値、infoのストレージドライバー名です)
参考
- subuidの割り当ては、
usermod --add-subuids 100000-165535 podsterか、/etc/subuidに1行追加して行います。 - ユーザー権限での実行は、
su - podster -c 'podman info --format json'の形です。 - JSONのパースには、
jqを使えます。例:jq -r '.store.graphRoot' /root/pod/info.json - 設定ディレクトリを作成したあと、
chown -R podster:podster /home/podster/.configを忘れないでください。 - よくある間違い1: ステップ4で、コンテナのUID 1を100001と計算してしまうこと。範囲の最初の値が、UID 1に対応します。
- よくある間違い2: 設定ファイルをroot所有で作成して、podsterが読めなくなること。
対象ユーザーを確認する
/root/podディレクトリを作成して、ユーザーpodsterのuid gid 홈경로を(プレースホルダーはホームのパスです)空白で区切って1行で、/root/pod/user.txtに書いてください。
idコマンドで、uid、gid、ホームディレクトリを確認できます。getent passwdも役に立ちます。
subuidの範囲を割り当てる
/etc/subuidに、podsterへ開始100000、個数65536の範囲を割り当ててください。
形式は、ユーザー:開始UID:個数です。usermodでも、ファイルの直接編集でもできます。
subgidの範囲を割り当てる
/etc/subgidにも、同じ範囲を割り当ててください。
subuidと同じ形式です。GIDも、同じ理由で範囲が必要です。
マッピングを計算する
/root/pod/mapping.txtを、次の3行で作成してください。
CONTAINER_0=<컨테이너 안 UID 0 에 대응하는 호스트 UID> / CONTAINER_1=<컨테이너 안 UID 1 의 호스트 UID> / CONTAINER_1000=<컨테이너 안 UID 1000 의 호스트 UID>(プレースホルダーは、順に、コンテナ内のUID 0に対応するホストUID、コンテナ内のUID 1のホストUID、コンテナ内のUID 1000のホストUIDです)
コンテナ内のUID 0はユーザー本人にマッピングされ、1からが範囲の始まりです。オフセットに注意してください。
storage.confを作成する
/home/podster/.config/containers/storage.confを作成してください。[storage]セクションに、driver、runroot、graphrootの3つのキーがある必要があり、graphrootは/home/podster/.local/share/containers/storageである必要があります。ファイルの所有者はpodsterである必要があります。
ユーザー別の設定は、ホームの下の.config/containersに置きます。[storage]セクションに、3つのキーが必要です。
registries.confを作成する
/home/podster/.config/containers/registries.confを作成してください。unqualified-search-registriesにdocker.ioが含まれている必要があり、docker.ioを社内ミラーmirror.labhub.local/dockerhubへ向ける[[registry]]ブロックがある必要があります。ファイルの所有者はpodsterである必要があります。
unqualified検索のリストは配列で、ミラーは[[registry]]ブロックで書きます。prefixとlocationが対になります。
podman infoで検証する
podsterの権限でpodman infoを実行して、結果を/root/pod/info.jsonとして保存してください。JSON形式である必要があり、graphRootの値が、ステップ5で指定したパスである必要があります。
そのユーザーの権限で実行して初めて、ユーザー別の設定が反映されます。su -でログインシェルを開くほうが、安全です。
初期設定のチェックリストを作成する
/root/pod/checklist.txtを、次の5行で作成してください。
SUBUID=yes / SUBGID=yes / ROOTLESS=<info 의 rootless 값 true/false> / GRAPHROOT=<info 의 graphRoot 값> / DRIVER=<info 의 스토리지 드라이버 이름>(プレースホルダーは、順に、infoのrootlessの値のtrueまたはfalse、infoのgraphRootの値、infoのストレージドライバー名です)
前のステップで確認した、実際の値を集めてください。パスは、絶対パスで書きます。