ルートレスドッカー+権限のないコンテナ - 読み書きボリューム

ルートレスドッカー+権限のないコンテナ - 読み書きボリューム

ホストオペレーティングシステム:Debian 11 Bullseye

ドッカーバージョン: 5:24.0.2-1~debian.11~bullseye

コンテナオペレーティングシステム:Debian 10 Buster


コンテキスト

アプリケーションをコンテナ化しようとしていますが、コンテナを再起動しても状態を維持する必要があります。

すべての動的データを/var/lib/

したがって、最も簡単な解決策は、ディレクトリをドッカーボリュームで上書きすることです。

標準のDocker操作ではこれは問題ではありません。ただし、潜在的なコンテナリークとコンテナエスケープの脆弱性のセキュリティ上の問題のため、Dockerデーモンとコンテナアプリケーションの両方がrootではなくユーザーとして実行されることをお勧めします。


質問

コンテナ内のアプリケーションも権限のないユーザーとして実行する必要があるため、アプリケーションユーザーが書き込み可能な方法でボリュームをマウントすることはできません。

フォルダ所有者の設定中ビルドステップイメージの実行中にのみインストールで上書きされるので意味がありません。

そして後で権限を変更することはできません。コンテナの起動これは、権限のないユーザーのコンテキストですでに実行されており、マウントポイントがroot:root所有であるためです。


質問

私の質問は簡単です。権限のないユーザーのためにコンテナ内にRWボリュームマウントを実装する方法はありますか?

ベストアンサー1

これを達成する方法を探している人のために最終的にそこに到達しましたが、方法は明確ではありません。

主な点は次のとおりです。

  • イメージをrootとして実行
  • 次のことができるスクリプトのエントリポイントを設定します。
    1. まず、ボリュームマウントポイントを再帰的に調整します。
    2. デフォルトの予想プロセスに実行を渡し、プロセス内のユーザーを変更します。

gosu2番目のポイントは、インベントリを使用すると必要なだけ作業できないため、管理を使用しました。su

エントリポイントスクリプトの完全な例:

#!/bin/sh
chown -R myAppUser: /var/lib/myAppData 
exec gosu myAppUser /usr/local/bin/myApp --foo=bar

最終結果:ルートなしのDockerインスタンスでも、外部にマウントされたボリュームへの完全な読み取りおよび書き込みアクセス権を持ち、myAppDockerで実行されます。myAppUser/var/lib/myAppData

おすすめ記事