マイクロサービスアプローチを使用して製品を構築しています。それぞれがdocker-composeを使用して実行するいくつかのプロジェクトを使用しています。問題は、開発環境で複数のプロジェクトのコードを変更して開発したコードをテストする場合、プロジェクトを個別に実行して手動でリンクする必要があることです。
次に、プロジェクトのクローンを作成してそれらを一緒に実行し、リンクを処理する開発キットを作成します。 docker-composeは複数のdocker-composeファイルを処理できますか?そうでない場合、それを行うのに十分なツールはありますか?または、私たちの目標に推奨されるアプローチはありますか?
編集:たとえば、PROJECT_AとPROJECT_Bの2つのプロジェクトがあります。それぞれに独自のdocker-compose.ymlがあり、実行するにはpostgresqlが必要です。次のように、PROJECT_Aにdocker-compose.ymlがあります。
db:
image: postgres:9.4
ports:
- "5432"
project_a:
build: .
command: python2.7 main.py
links:
- db
そして、次のようにPROJECT_Bにdocker-compose.ymlがあります。
db:
image: postgres:9.4
ports:
- "5432"
project_b:
build: .
command: python2.7 main.py
links:
- db
各プロジェクトは個別に実行でき、正常に動作します。ただし、PROJECT_AとPROJECT_Bの間でAPIを変更する場合は、両方のプロジェクトを実行し、それらをリンクして、コードをテストする必要があります。次に、両方のプロジェクトを実行し、必要に応じてそれらをリンクできる開発キットプロジェクトを作成します。これを行うための最良のアプローチは何ですか?
これを行うには、docker-compose
の- extends
機能を使用して、複数のファイルのサービスを組み合わせます。明確に定義された場所にプロジェクトを置き、相対パスを使用してそれらを参照します。
../
├── foo/
│ └── docker-compose.yml
└── bar/
└── docker-compose.yml
base:
build: .
foo:
extends:
service: base
links:
- db
db:
image: postgres:9
このプロジェクトを単独でテストしたい場合は、次のようにします。
Sudo docker-compose up -d foo
Foo_foo_1を作成しています
foo:
extends:
file: ../foo/docker-compose.yml
service: base
links:
- db
bar:
build: .
extends:
service: base
links:
- db
- foo
db:
image: postgres:9
これで、両方のサービスを一緒にテストできます。
Sudo docker-compose up -d bar
Bar_foo_1の作成
bar_bar_1を作成しています
質問が100%確実ではないので、これは幅広い回答になります。
1)同じマシンまたはサーバークラスターで実行されている場合、すべてが同じ構成ファイルに含まれている可能性があります。
#proxy
haproxy:
image: haproxy:latest
ports:
- 80:80
#setup 1
ubuntu_1:
image: ubuntu
links:
- db_1:mysql
ports:
- 80
db1:
image: ubuntu
environment:
MYSQL_ROOT_PASSWORD: 123
#setup 2
ubuntu_2:
image: ubuntu
links:
- db_2:mysql
ports:
- 80
db2:
image: ubuntu
environment:
MYSQL_ROOT_PASSWORD: 123
複数のymlファイルを結合することも可能です$docker-compose -f [File A].yml -f [File B].yml up -d
2)ビルド内のすべてのコンテナーは、作成で個別に制御できます。$docker-compose stop/start/build/ ubuntu_1
3)$docker-compose build
itを使用すると、変更が行われた場所でのみ再構築されます。
役立つと思われる詳細情報を以下に示します https://docs.docker.com/compose/extends/#extending-services
上記のいずれも正しくない場合は、ビルドの例をご覧ください。
これは、同じ問題を抱えている他の人のための私たちのアプローチです:
これで、各プロジェクトに、スタンドアロンで実行できるdocker-composeができました。 「development-kit」という別のプロジェクトがあり、必要なプロジェクトを複製してディレクトリに保存しています。コマンドsimiliarを使用してプロジェクトを実行すると、次のことができます。
python controller.py --run projectA projectB
Docker-compose upコマンドを使用して各プロジェクトを実行します。次に、すべてのプロジェクトが稼働中になると、次のコマンドを使用して、他のすべてのプロジェクトのメインDockerのIPを/ etc/hosts ipsに追加することで、他のプロジェクトに追加し始めます。
# getting contaier id of projectA and projectB
CIDA = commands.getoutput("docker-compose ps -q %s" % projectA)
CIDB = commands.getoutput("docker-compose ps -q %s" % projectB)
# getting ip of container projectA
IPA = commands.getoutput("docker inspect --format '{{ .NetworkSettings.IPAddress }}' %s" % CIDA)
ここで、projectBからprojectAにリクエストを送信するために、projectBの設定でprojectA IPを「projectA」として定義するだけで済みます。