[解決済み] gosuとUSERを使ったDockerの比較
質問
Docker
のようなものは、常に
USER
コマンドで特定のユーザーとしてプロセスを実行することができますが、一般的には多くのものがROOTとして実行されなければなりませんでした。
私はこれまで、多くの画像で
ENTRYPOINT
と
gosu
を使って、実行するプロセスの昇格を解除します。
の必要性について、まだ少し混乱しています。
gosu
. USERで十分ではないでしょうか?
Docker 1.10でセキュリティの面でかなり変わったのは知っていますが、Dockerコンテナでプロセスを実行する推奨方法については、まだはっきりしません。
どなたか、どのような場合に
gosu
vs.
USER
?
ありがとうございます。
EDIT
Dockerは
ベストプラクティスガイド
はあまり明確ではありません: プロセスが特権なしで実行される場合、そのプロセスは
USER
を、sudo が必要な場合は
gosu
.
でROOTとしていろいろなものをインストールすることができるので、これは混乱します。
Dockerfile
としてインストールし、ユーザーを作成して適切な権限を与え、最後にそのユーザーに切り替えて
CMD
をそのユーザで実行します。
では、なぜ sudo や
gosu
が必要なのでしょうか?
どのように解決するのですか?
Dockerfileはイメージを作成するためのものです。Dockerfileの実行コマンドの間でユーザを変更できなくなったときに、コンテナの初期化の一部としてgosuがより有用であると私は考えています。
イメージを作成した後、gosuのようなものを使えば、コンテナ内のエントリポイントの最後にroot権限を落とすことができます。いくつかの初期化ステップ (uid の修正、ホスト マウントされたボリュームのパーミッションなど) を行うために、最初は root アクセスが必要な場合があります。その後、初期化されたら、最終的なサービスをルート権限なしで、シグナルをきれいに処理するために pid 1 として実行します。
編集します。 dockerとjenkins用のイメージでgosuを使用する簡単な例です。 https://github.com/bmitch3020/jenkins-docker
entrypoint.sh は /var/lib/docker.sock ファイルの gid を調べ、コンテナ内の docker ユーザーの gid を一致させるように更新します。これにより、ホスト上の gid が異なる可能性のある他の docker ホストにイメージを移植することができます。グループを変更するには、コンテナ内の root アクセスが必要です。もし私が
USER jenkins
を使用していた場合、イメージで定義されたドッカーグループの gid を使用することになり、実行するドッカーホストの gid と一致しない場合は動作しないことになります。しかし、アプリを実行する際にルートアクセスを落とすことができますので、そこでgosuの出番となります。
スクリプトの最後で、execコールはシェルがgosuをフォークするのを防ぎ、代わりにpid 1をそのプロセスで置き換えます。Gosu も同様に、uid を切り替えてから jenkins プロセスを exec して、pid 1 として引き継ぎます。これにより、pid 1 としてシェルによって無視されるシグナルが正しく処理されるようになります。
関連
-
[解決済み] Dockerコンテナの中から、マシンのローカルホストに接続するにはどうすればよいですか?
-
[解決済み] Docker Dockerコンテナからホストへのファイルコピー
-
[解決済み] ホストからDockerコンテナにファイルをコピーする方法は?
-
[解決済み] リポジトリを使用せずに、あるホストから別のホストにDockerイメージをコピーする方法
-
[解決済み] ホストからDockerコンテナのIPアドレスを取得する方法
-
[解決済み] Dockerコンテナに環境変数を渡すにはどうしたらいいですか?
-
[解決済み] dockerコンテナ内でsudoを使用するには?
-
[解決済み】Dockerは仮想マシンとどう違うの?
-
[解決済み] docker build でリポジトリが署名されていない
-
[解決済み] kubernetesのPodsでイメージのプルを再試行する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Dockerがコンテキスト外のシンボリックリンクをフォローする
-
[解決済み] Dockerコンテナ内でCurlコマンドを実行できない
-
[解決済み] dockerコンテナにroot以外のユーザーで接続する
-
[解決済み] docker 1.9+で名前付きボリュームの内容をリストアップするには?
-
[解決済み] Kubernetesの秘密を解き明かす
-
[解決済み] docker-compose.yml を使ってコンテナを自動削除する
-
[解決済み] docker-compose のコンテキストまたはワークディレクトリー
-
[解決済み] RHEL上のDocker CE - Requires: container-selinux >= 2.9
-
[解決済み] docker-machine VirtualBoxインスタンスにsshで入るには?
-
[解決済み] プライベートなDockerレジストリにリモートでアクセスするには?