回答:
Dockerコンテナ内のアプリに秘密を取得するには、3つの方法があります。最初の2つは、Docker構成に関係します。最後の1つは、アプリにシークレットストアからシークレットを直接取得させることです。
「The 12 Factor App」ガイドによると、シークレットは単なる設定であり、環境内で常に設定する必要があります。Dockerの実行中にシークレットを環境変数として設定すると、アプリからそこにアクセスできます。
すべてのシークレットを特定の構成/シークレットファイル内に配置し、それをマウントされたボリュームとしてインスタンスにマウントできます。
@ 030で述べたように、Hashicorp Vault(または「Amazon Secrets Manager」、またはそのようなサービス)を使用できます。
アプリまたはサイドカーアプリは、Dockerコンテナの設定を処理することなく、必要なシークレットを直接取得できます。この方法により、動的に作成されたシークレット(このようなシステムの非常に魅力的な機能)を使用でき、シークレットをファイルシステムから表示したり、dockerコンテナーのenv変数を検査したりする心配はありません。
env変数を使用する方法だと思います。CIビルドシステムでビルド中にシークレットを取得し、展開時に設定する場合、Hashicorp Vaultなどのシークレットストアから管理できます。両方の長所を最大限に活用できます。また、秘密を取得するためにアプリケーションコードを記述する必要がない開発者の利点も得られます。開発者はコード機能に集中し、パスワードの取得などの管理タスクを処理しないようにする必要があります。
アプリケーションのコードは、アプリケーション自体の機能自体に焦点を合わせ、パスワードの取得などのバックエンドタスクを処理しないようにする必要があります。12因子アプリの状態と同じです。
編集:最後の文を変更して、開発者とシステム管理者のサイロ化の影響を除去しました。タスク自体はコードの観点から分離する必要がありますが、DevOpsは両方を念頭に置いて、制限されることのないほぼ同じ人物です。
@Dirkのすばらしいコメント(秘密をDockerコンテナに渡す)ごとに、 ENV変数よりも秘密ストアを優先するという非常に強力な議論があります。
inspect
or exec
コマンドを使用してそれらを見ることができます。stdout
いくつかのデバッグモードで実行している場合、環境変数はしばしばログファイルにダンプされます。生成されたすべての子プロセスは、制御できない可能性のあるものを読み取って公開できます。ここでの詳細については、例えば: diogomonica.com/2017/03/27/...
パイプのみを使用する別のオプションがあります。
docker run -d -i --name $n alpine sh -c 'read A; echo "[$A]"; exec some-server'
docker exec -i $n sh -c 'cat > /proc/1/fd/0' <<< _a_secret_
まず、でdockerデーモンを作成します。-i
コマンドread A
は、からの入力を待ってハングし/proc/1/fd/0
ます。次に、2番目のdockerコマンドを実行し、stdinからシークレットを読み取り、最後のハングプロセスにリダイレクトします。