docker compose fileを分割する

## 背景

kindindでcontainerを複数準備する必要があり、composeファイルが徐々に肥大化して辛くなってしまっていた。
yamlのファイル分割は良いが、他のアプローチが存在しないかと思いreference したらあったので、覚書と軽く運用方法を記載する。

## TL;DR

1. [Include](https://docs.docker.com/compose/how-tos/multiple-compose-files/include/)を利用する
1. [Merrge](https://docs.docker.com/compose/how-tos/multiple-compose-files/merge/)を利用する

## 0. 現状

frontendとapi serverの二種類のみ作成します。(redisやdbやproxyなどは置いておく)

```terminal
tree . -L 2
.
├── README.md
├── apps
│   ├── api-server # api server
│   └── web_client # vite などweb-frontendのrun server
├── compose.yaml
```

```compose.yaml
services:
  nest_container:
    container_name: nest_container
    build:
      context: .
      dockerfile: dockerfile
      target: development
      args:
        - NODE_VERSION=22.13
    volumes:
      - ./apps/api-server:/workspace
    tty: true
    restart: on-failure:3
    ports:
      - 3000:3000
    networks:
      - nest_container
  web_client:
    container_name: web_client_container
    build:
      context: .
      dockerfile: dockerfile
      target: development
      args:
        - NODE_VERSION=22.13
    volumes:
      - ./apps/web_client:/workspace
    tty: true
    restart: on-failure:3
    ports:
      - 4200:4200
    networks:
      - nest_container

networks:
  nest_container: {}

```

## 1. Includeを利用する

[Include](https://docs.docker.com/compose/how-tos/multiple-compose-files/include/)は、`docker compose up`で利用する`compose.yaml`に依存関係をinclude blockで記載する。

```terminal
tree . -L 3 -P 'compose.yaml' --prune
.
├── apps
│   ├── app-server
│   │   └── compose.yaml
│   └── web_client
│       └── compose.yaml
└── compose.yaml
```

```compose.yaml
include:
  - apps/app-server/compose.yaml
  - apps/web_client/compose.yaml

networks:
  nest_container: {}
```

```apps/app-server/compose.yaml
services:
  nest_container:
    container_name: nest_container
    build:
      context: .
      dockerfile: dockerfile
      target: development
      args:
        - NODE_VERSION=22.13
    volumes:
      - .:/workspace
    tty: true
    restart: on-failure:3
    ports:
      - 3000:3000
    networks:
      - nest_container
```

```apps/web_client/compose.yaml
services:
  web_client:
    container_name: web_client_container
    build:
      context: .
      dockerfile: dockerfile
      target: development
      args:
        - NODE_VERSION=22.13
    volumes:
      - .:/workspace
    tty: true
    restart: on-failure:3
    networks:
      - nest_container
```

## 2. Mergeを利用する

[Merge](https://docs.docker.com/compose/how-tos/multiple-compose-files/merge/)は、`-f`でファイルを指定して統合利用することができる。

```terminal
tree . -L 3 -P 'compose.yaml' --prune
.
├── apps
│   ├── app-server
│   │   └── compose.yaml
│   └── web_client
│       └── compose.yaml
```

```apps/app-server/compose.yaml
services:
  nest_container:
    container_name: nest_container
    build:
      context: .
      dockerfile: dockerfile
      target: development
      args:
        - NODE_VERSION=22.13
    volumes:
      - .:/workspace
    tty: true
    restart: on-failure:3
    ports:
      - 3000:3000
    networks:
      - nest_container

networks:
  nest_container:
    external: true
```

```apps/web_client/compose.yaml
services:
  web_client:
    container_name: web_client_container
    build:
      context: .
      dockerfile: dockerfile
      target: development
      args:
        - NODE_VERSION=22.13
    volumes:
      - .:/workspace
    tty: true
    restart: on-failure:3
    networks:
      - nest_container

networks:
  nest_container:
    external: true

```

networkについては、上書きをベースに記載すればいいが、順序性が生まれて地味にめんどくさそうなので、最初に作る想定でよいかなと思います。

```Makefile
compose = @docker compose

.PHONY: local.up, local.init

local.init:
	@docker network create -d bridge nest_container

local.up:
	$(compose) -f apps/app-server/compose.yaml -f apps/web_client/compose.yaml up -d
```

一丁一旦ありそうな気がするのですが、localでとりあえず開発する時はIncludeで良いかなと思った。