目的
SymfonyをDockerで開発したい。自分でdocker-composeファイルを作っていたけど、公式に乗っかりたいな?ってところで、調べてみた
メモ
公式のドキュメント、Using Docker with Symfony で、https://github.com/dunglas/symfony-docker を使うといいよと記載がある。
https://github.com/dunglas/symfony-docker のGetting Startedを進めていくと、自動的にプロジェクト作成されて表示される。
特徴
-
このままプロダクションとしてDockerでデプロイするまで考えられている。
-
Support for Extra Servicesに記載されているけど、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が変更されます。
###> 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 ###
###> 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関係のモジュールがイメージに入ってないので、永遠に疎通確認ができませんでした。
解決策
これでハマる人もいるらしく、常にDockerを起動する時は、ビルドして見ること必須みたい。。。
# docker-compose up --build
メールキャッチャー
symfony/mailerを導入すると、docker-compose.override.yml
に以下のようにイメージが追加されます。
アウト側のポート番号が指定されていないので、適当にマッピングされるようです。
###> symfony/mailer ###
mailer:
image: schickling/mailcatcher
ports: [1025, 1080]
###< symfony/mailer ###
http://127.0.0.1:1080
にアクセスしてもアクセスができません。
docker-compose ps
で確認をしました。
# 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