symfony を Dockerで利用する

# 目的

SymfonyをDockerで開発したい。自分でdocker-composeファイルを作っていたけど、公式に乗っかりたいな？ってところで、調べてみた

# メモ

公式のドキュメント、[Using Docker with Symfony](https://symfony.com/doc/current/setup/docker.html) で、https://github.com/dunglas/symfony-docker を使うといいよと記載がある。

https://github.com/dunglas/symfony-docker の[Getting Started](https://github.com/dunglas/symfony-docker#getting-started)を進めていくと、自動的にプロジェクト作成されて表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/a2a7d2a3-06b3-f448-523e-7f7de5a1bbbb.png)

# 特徴

* このままプロダクションとしてDockerでデプロイするまで考えられている。
* [Support for Extra Services](https://github.com/dunglas/symfony-docker/blob/main/docs/extra-services.md)に記載されているけど、composerで以下を導入すると、連動して、DockerファイルとDocker-compose.ymlが更新される！？

* symfony/orm-pack: install a PostgreSQL service
* symfony/mercure-bundle: use the Mercure.rocks module shipped with Caddy
* symfony/panther: install chromium and these drivers
* symfony/mailer: install a MailCatcher service
* blackfireio/blackfire-symfony-meta: install a Blackfire service


イメージとしては、composerでDoctrineを導入すると、.envに説明が追加されます。
ああいう感じで、Dockerfileやdocker-comopse.ymlが変更されます。


```Dockerfile:Dockerfile
###> recipes ###
###> doctrine/doctrine-bundle ###
RUN apk add --no-cache --virtual .pgsql-deps postgresql-dev; \
	docker-php-ext-install -j$(nproc) pdo_pgsql; \
	apk add --no-cache --virtual .pgsql-rundeps so:libpq.so.5; \
	apk del .pgsql-deps
###< doctrine/doctrine-bundle ###
###< recipes ###

```

```yml:docker-compose.yml

###> doctrine/doctrine-bundle ###
  database:
    image: postgres:${POSTGRES_VERSION:-13}-alpine
    environment:
      POSTGRES_DB: ${POSTGRES_DB:-app}
      # You should definitely change the password in production
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ChangeMe}
      POSTGRES_USER: ${POSTGRES_USER:-symfony}
    volumes:
      - db-data:/var/lib/postgresql/data:rw
      # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data!
      # - ./docker/db/data:/var/lib/postgresql/data:rw
###< doctrine/doctrine-bundle ###

volumes:
  php_socket:
  caddy_data:
  caddy_config:
###> symfony/mercure-bundle ###
###< symfony/mercure-bundle ###

###> doctrine/doctrine-bundle ###
  db-data:
###< doctrine/doctrine-bundle ###
```


このため、イメージのリビルドをしないと動かなかくて、1日がはまりました＞＜


# はまった内容

この仕組み上、PostgreSQLやMailCatcherのコンテナが自動的に追加されるので、PHPのコンテナがDBの起動を待ち受けるのです。

entryPointのシェルスクリプトでDBの起動確認をするのですけど、PostgreSQL関係のモジュールがイメージに入ってないので、永遠に疎通確認ができませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/182f8689-cc31-e340-aae2-9d5fb712af2d.png)

## 解決策

これでハマる人もいるらしく、常にDockerを起動する時は、ビルドして見ること必須みたい。。。

```bash
# docker-compose up --build
```


# メールキャッチャー

symfony/mailerを導入すると、```docker-compose.override.yml```に以下のようにイメージが追加されます。
アウト側のポート番号が指定されていないので、適当にマッピングされるようです。

```yml: docker-compose.override.yml
###> symfony/mailer ###
  mailer:
    image: schickling/mailcatcher
    ports: [1025, 1080]
###< symfony/mailer ###

```

```http://127.0.0.1:1080```にアクセスしてもアクセスができません。


```docker-compose ps```で確認をしました。


```bash
# docker-compose -f .\docker-compose.yml -f .\docker-compose.override.yml -f .\docker-compose.debug.yml ps              
NAME                         COMMAND                  SERVICE             STATUS              PORTS
test-adminer-1    "entrypoint.sh docke…"   adminer             running             0.0.0.0:8033->8080/tcp
test-caddy-1      "caddy run --config …"   caddy               running             0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:443->443/udp
test-database-1   "docker-entrypoint.s…"   database            running             0.0.0.0:58077->5432/tcp
test-mailer-1     "mailcatcher --no-qu…"   mailer              running             0.0.0.0:58080->1025/tcp, 0.0.0.0:58081->1080/tcp
test-php-1        "docker-entrypoint p…"   php                 running (healthy)   9000/tcp
```