CI / CDパイプライン実装でのさまざまなテナントのDockerfileの動的な管理


13

私は、Docker、Kubernetes、およびJenkinsを使用して、プロジェクトのCI / CDパイプラインを実装しようとしています。私のアプリケーションはマルチテナントアプリケーションで、データベースアプリケーションの変数はすべて、テナントごとに異なります。

アプリケーション戦略

Dockerイメージを構築するときは、Dockerfileを使用しています。そして、DockerfileをSVNコードリポジトリ内に保持します。すべてのテナントで、コードリポジトリは同じです。イメージを構築するときは、その時点で、テナントごとに異なるイメージを構築する必要があります。

Dockerfileの実装

私のドッカーファイルに次のようなエントリポイントを追加しています、

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=tenant1config" , "TestProject.war"]

別のテナントのDockerイメージを構築する必要がある場合は、追加する必要があります
-Dspring.profiles.active=tenant2config

したがって、Dockerfileのエントリポイントは動的です。

私の混乱

  1. 動的にDockerfile内のエントリポイントコマンドを管理することは可能ですか?
  2. または、別のテナント用に別のDockerfileを追加する必要がありますか?また、別のテナントに対してdocker buildコマンドを個別に実行する必要がありますか?

この問題の標準的な実装方法を見つけるにはどうすればよいですか?


3
ENTRYPOINTieで環境変数を使用して、... -Dspring.profiles.active=${TENANT}デプロイメント中に正しい環境を設定できます。
masseyb

回答:


13

12要素からの引用-構成

アプリの構成は、デプロイ(ステージング、プロダクション、開発者環境など)によって異なる可能性のあるすべてのものです。これも:

  • データベース、Memcached、およびその他のバッキングサービスへのリソースハンドル

  • Amazon S3やTwitterなどの外部サービスへの認証情報

  • デプロイの正規ホスト名などのデプロイごとの値

あなたはすべきではないバイナリが同じである必要がありますし、任意のランタイム構成は環境を介して注入する必要があるとして、各テナントに個別のドッキングウィンドウのイメージを構築します。

ランタイム構成を挿入するためのさまざまなオプションがあります

  1. 環境変数

エントリポイントにプロファイルをハードコーディングする代わりに、環境変数を追加します

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"]

次に、kubernetesデプロイメント構成から環境変数を注入します。https: //kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/を参照してください

  1. プロファイル構成を構成としてマウントして参照します

エントリポイントは次のようになります

ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] 次に、必要な構成ファイルをkubernetes構成としてマウントします。

どちらの方法でも、Dockerイメージからランタイム構成を外部化し、デプロイメント構成を通じて環境変数または構成として注入します。


1
SPRING_PROFILES_ACTIVE(環境変数はそのまま使用できます)。java追加パラメーターは必要ありません。
Manuel Polacek

3

docker ARGSを利用できます。これはビルド時にのみ使用可能であり、これはエントリーポイントで使用できます。

docker build --build-arg CONFIG_FILE=<file_name> -t tag_name .

CONFIG_FILEは、構成ファイルの場所を保持し、動的に渡すことができます。エントリポイントを$CONFIG_FILE

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$CONFIG_FILE" , "TestProject.war"]

ARG CONFIG_FILE-Dockerfile内で宣言する必要があります
Roman M

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.