ホストオペレーティングシステム:Debian 11 Bullseye
ドッカーバージョン: 5:24.0.2-1~debian.11~bullseye
コンテナオペレーティングシステム:Debian 10 Buster
コンテキスト
アプリケーションをコンテナ化しようとしていますが、コンテナを再起動しても状態を維持する必要があります。
すべての動的データを/var/lib/
。
したがって、最も簡単な解決策は、ディレクトリをドッカーボリュームで上書きすることです。
標準のDocker操作ではこれは問題ではありません。ただし、潜在的なコンテナリークとコンテナエスケープの脆弱性のセキュリティ上の問題のため、Dockerデーモンとコンテナアプリケーションの両方がrootではなくユーザーとして実行されることをお勧めします。
質問
コンテナ内のアプリケーションも権限のないユーザーとして実行する必要があるため、アプリケーションユーザーが書き込み可能な方法でボリュームをマウントすることはできません。
フォルダ所有者の設定中ビルドステップイメージの実行中にのみインストールで上書きされるので意味がありません。
そして後で権限を変更することはできません。コンテナの起動これは、権限のないユーザーのコンテキストですでに実行されており、マウントポイントがroot:root所有であるためです。
質問
私の質問は簡単です。権限のないユーザーのためにコンテナ内にRWボリュームマウントを実装する方法はありますか?
ベストアンサー1
これを達成する方法を探している人のために最終的にそこに到達しましたが、方法は明確ではありません。
主な点は次のとおりです。
- イメージをrootとして実行
- 次のことができるスクリプトのエントリポイントを設定します。
- まず、ボリュームマウントポイントを再帰的に調整します。
- デフォルトの予想プロセスに実行を渡し、プロセス内のユーザーを変更します。
gosu
2番目のポイントは、インベントリを使用すると必要なだけ作業できないため、管理を使用しました。su
エントリポイントスクリプトの完全な例:
#!/bin/sh
chown -R myAppUser: /var/lib/myAppData
exec gosu myAppUser /usr/local/bin/myApp --foo=bar
最終結果:ルートなしのDockerインスタンスでも、外部にマウントされたボリュームへの完全な読み取りおよび書き込みアクセス権を持ち、myApp
Dockerで実行されます。myAppUser
/var/lib/myAppData