podman: 共有ボリュームの権限のためにコンテナ ユーザーをホスト ユーザーにマップする

podman: 共有ボリュームの権限のためにコンテナ ユーザーをホスト ユーザーにマップする

私はpodmanを使ってセットアップしようとしていますgitea

  • データボリュームをホストディレクトリにマップすると、データの検査やバックアップが簡単に行えるため
  • 特定のホストユーザーによって実行されたコンテナプロセス

podman generate systemd --newPodmanはrootユーザーによって実行されますが、これは主にrootlessコンテナで発生した問題が原因です(systemd User= ディレクティブはサポートされていません。なぜでしょうか?そしてルートレスサービスを実行するために systemd で User= をサポートする)。

ルートフルコンテナでのマッピングを実現するために、使用中のコンテナuidの とgidをすべてホストの にマッピングし始めましたgitea user。最終的には次のようなものになりました。

podman run --rm \
    --uidmap=0:$(id -u gitea):1 \
    --gidmap=0:$(id -g gitea):1 \
    --uidmap=1000:$(id -u gitea):1 \
    --gidmap=1000:$(id -g gitea):1 \
    --gidmap=42:$(id -g gitea):1 \
    --volume /srv/gitea/data:/var/lib/gitea \
    docker.io/gitea/gitea:1.18.0-rc1-rootless

得られた出力は

WARN[0000] Path "/etc/SUSEConnect" from "/etc/containers/mounts.conf" doesn't exist, skipping 
WARN[0000] Path "/etc/zypp/credentials.d/SCCcredentials" from "/etc/containers/mounts.conf" doesn't exist, skipping 
Error: OCI runtime error: runc create failed: unable to start container process: can't get final child's PID from pipe: EOF

パス警告にもかかわらず、他の podman コンテナは正常に実行できたので、無視できると思います。

私はpodman version 3.4.7openSUSE Leap 15.3 で実行しています。

使用中のすべてのuidおよび をgid特定のホスト ユーザー/グループにマッピングしながら、このコンテナーを実行するにはどうすればよいですか?

答え1

uid根本的な原因は、複数のコンテナ(およびgid) を単一のuid/からgidホストにマッピングしようとしたことにあるようです。そこで、(コンテナからホストに) をマッピングしようとしました。

  • UID 0 → gitea
  • GID 0 → ギティア
  • UID 1000 → gitea
  • GID 1000 → ギテア
  • GID 42 → ギテア

代わりに、私は別のマッピングにフォールバックしています。ここでは、Giteaアプリを実際に実行している1000のUID/GIDペアだけがホストユーザーにマッピングされ、他のユーザーは別のUID範囲を受け取ります。

    --uidmap=0:10000:999 \
    --gidmap=0:10000:999 \
    --uidmap=1000:$(id -u gitea):1 \
    --gidmap=1000:$(id -g gitea):1 \

これは、次のマッピングがあることを意味します

  • UID 0-999 → 10000-10999
  • GID 0-999 → 10000-10999
  • UID 1000 → gitea
  • GID 1000 → ギテア

この変更により、コンテナは正常に起動し、ホスト上の権限は期待どおりになります。

関連情報