web-dev-qa-db-ja.com

それぞれがdocker-composeで実行されるdockerを使用して複数のプロジェクトを実行する

マイクロサービスアプローチを使用して製品を構築しています。それぞれが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を変更する場合は、両方のプロジェクトを実行し、それらをリンクして、コードをテストする必要があります。次に、両方のプロジェクトを実行し、必要に応じてそれらをリンクできる開発キットプロジェクトを作成します。これを行うための最良のアプローチは何ですか?

17
Mehran Akhavan

これを行うには、docker-composeの-​​ extends 機能を使用して、複数のファイルのサービスを組み合わせます。明確に定義された場所にプロジェクトを置き、相対パスを使用してそれらを参照します。

../
├── foo/
│   └── docker-compose.yml
└── bar/
    └── docker-compose.yml

foo/docker-compose.yml:

base:
    build: .

foo:
    extends:
        service: base
    links:
        - db

db:
    image: postgres:9

このプロジェクトを単独でテストしたい場合は、次のようにします。

Sudo docker-compose up -d foo

Foo_foo_1を作成しています

bar/docker-compose.yml:

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を作成しています

10
z0r

質問が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

上記のいずれも正しくない場合は、ビルドの例をご覧ください。

3
Mathias Asberg

これは、同じ問題を抱えている他の人のための私たちのアプローチです:

これで、各プロジェクトに、スタンドアロンで実行できる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」として定義するだけで済みます。

1
Mehran Akhavan