2026幎㮠Symfony ãš DockerïŒéçºç°å¢ãšæ¬çªãããã€
2026幎çã®å®å šãª Symfony Docker ã¯ãŒã¯ãããŒãFrankenPHP éçºç°å¢ããã«ãã¹ããŒãžæ¬çªã€ã¡ãŒãžãã¯ãŒã«ãŒã¢ãŒããæå·åã·ãŒã¯ã¬ãããã€ã¡ãŒãžæé©åããã€ã°ã¬ãŒã·ã§ã³ã䌎ããŒãããŠã³ã¿ã€ã ãããã€ãŸã§ã解説ããŸãã

ãã® Symfony Docker ãã¥ãŒããªã¢ã«ã§ã¯ãã³ã³ããã¯ãŒã¯ãããŒå šäœãæ§ç¯ããŸããåçŸæ§ã®é«ãããŒã«ã«éçºç°å¢ãšå ç¢ãªæ¬çªã€ã¡ãŒãžã®äž¡æ¹ããFrankenPHP ãš Symfony 7.4 LTS ãäžå¿ã«çµã¿ç«ãŠãŸããSymfony ãã³ã³ããã§åããã°ãããŒã PC ãšãµãŒããŒã®ããã ã§çããå€å žçãªç°å¢å·®ç°ãè§£æ¶ãããåãããã€ã¯å£ããããæåãµãŒããŒã³ãã³ãã®é£ç¶å®è¡ã§ã¯ãªããåäžã®äžå€ã¢ãŒãã£ãã¡ã¯ããé åžããã ãã®äœæ¥ã«ãªããŸãã
å ¬åŒã® Symfony Docker ãã³ãã¬ãŒãã¯ãåŸæ¥ã® Nginx ãš PHP-FPM ã®çµã¿åããã«ä»£ãããã©ã³ã¿ã€ã ãšã㊠FrankenPHP ãæ¡çšããããã«ãªããŸãããåäžã®ãã€ããªã HTTP/2 ãš HTTP/3 ãé ä¿¡ãããªã¯ãšã¹ãããšã«ã«ãŒãã«ãåæ§ç¯ããã®ã§ã¯ãªãèµ·åç¶æ ã®ãŸãŸä¿æããããšã§ãSymfony ãæ°žç¶çãªã¯ãŒã«ãŒã¢ãŒãã§å®è¡ããŸãã
Symfony åã Docker Compose éçºç°å¢
è¯ãéçºç°å¢ã¯ããã¹ããã·ã³ã«æãå ããããšãªãããã¹ãŠã®è²¢ç®è
ã«åã PHP ããŒãžã§ã³ãåãæ¡åŒµãåãããŒã¿ããŒã¹ãæäŸããŸããDocker Compose ã¯ãã®ã¹ã¿ãã¯ã宣èšçã«èšè¿°ããŸãã以äžã®äŸã§ã¯ãããŒã«ã«ã® Dockerfile ãããã«ããã FrankenPHP ã³ã³ãããš PostgreSQL 17 ãµãŒãã¹ãçµã¿åãããæ¢å®ã® Compose ãããã¯ãŒã¯äžã§æ¥ç¶ããŠããŸãã
# compose.yaml
services:
php:
build:
context: .
target: frankenphp_dev
ports:
- "80:80"
- "443:443"
volumes:
- ./:/app # bind mount: edits on the host appear instantly
- caddy_data:/data # persist TLS certificates across restarts
environment:
DATABASE_URL: "postgresql://app:app@database:5432/app?serverVersion=17"
depends_on:
- database
database:
image: postgres:17-alpine
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: app
volumes:
- db_data:/var/lib/postgresql/data
volumes:
caddy_data:
db_data:php ãµãŒãã¹ã®ãã€ã³ãããŠã³ãã¯ãããžã§ã¯ãã«ãŒããã³ã³ããå
ãžãããã³ã°ããããããã¡ã€ã«ã®å€æŽã¯ã€ã¡ãŒãžãåãã«ãããªããŠãåæ ãããŸããFrankenPHP ã¯ååèµ·åæã«ããŒã«ã«ã® TLS èšŒææžãçæããŸããããŒã 443 ãå
¬éããcaddy_data ãååä»ãããªã¥ãŒã ã«ããŠããã®ã¯ãã®ããã§ãèšŒææžã¯ docker compose down ããŸããã§ãä¿æãããŸããDSN å
ã® serverVersion=17 ãšãããã³ãã«ãã£ãŠãDoctrine ã¯æ¥ç¶ã®ãã³ã«å®è¡ãããããŒãžã§ã³æ€åºã¯ãšãªãçç¥ã§ããŸãã
ã¹ã¿ãã¯ãèµ·åããããšã¯ããã¹ãŠã® Symfony ã³ãã³ãããã¹ãã§ã¯ãªã php ã³ã³ããå
ã§å®è¡ããããããæ£ãã PHP ããŒãžã§ã³ãšæ¡åŒµãä¿èšŒãããŸããããŒã¿ããŒã¹ã®äœæããã€ã°ã¬ãŒã·ã§ã³ã®å®è¡ãã·ã§ã«ã®èµ·åã¯ãããã docker compose exec ãéããŠåããã¿ãŒã³ã§è¡ããŸãã
Symfony ã Composer ã®åŒã³åºãã«ã¯ docker compose exec php ãå眮ããã³ã³ããã® PHP ã©ã³ã¿ã€ã ã«å¯ŸããŠå®è¡ããŸããããšãã° docker compose exec php bin/console make:entity ã docker compose exec php composer require symfony/uid ã®ããã«ãªããŸãããã¹ãåŽã« PHP ãã€ã³ã¹ããŒã«ããå¿
èŠã¯äžåãããŸããã
Symfony æ¬çªåããã«ãã¹ããŒãž Dockerfile
ãã«ãã¹ããŒãž Dockerfile ã¯å ±éã®ããŒã¹ãå ±æããããã§ãéçºã¿ãŒã²ãããšæ¬çªã¿ãŒã²ããã«åå²ããŸããæ¬çªã¹ããŒãžã¯ã©ã³ã¿ã€ã äŸåã®ã¿ãã€ã³ã¹ããŒã«ããComposer ã®éçºçšããã±ãŒãžãé€å€ãããã«ãæã«ãã£ãã·ã¥ããŠã©ãŒã ã¢ããããããã皌åããã³ã³ããã¯å³åº§ã«èµ·åããŸãã
# Dockerfile
FROM dunglas/frankenphp:1-php8.4 AS base
WORKDIR /app
# Install the PHP extensions Symfony relies on
RUN install-php-extensions \
intl \
opcache \
pdo_pgsql \
zip
COPY /composer /usr/bin/composer
# --- Development target ---
FROM base AS frankenphp_dev
ENV APP_ENV=dev
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
# --- Production target ---
FROM base AS frankenphp_prod
ENV APP_ENV=prod
ENV FRANKENPHP_CONFIG="worker ./public/index.php"
ENV APP_RUNTIME="Runtime\FrankenPhpSymfony\Runtime"
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# Layer caching: copy manifests first, install, then copy the source
COPY composer.json composer.lock symfony.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
COPY . .
RUN composer dump-autoload --no-dev --classmap-authoritative \
&& composer dump-env prod \
&& bin/console cache:warmupæ®ãã®ãœãŒã¹ããå
ã« composer.json ãšããã¯ãã¡ã€ã«ãã³ããŒããããšãéµãšãªãæé©åã§ããDocker ã¯äŸåã€ã³ã¹ããŒã«ã®ã¬ã€ã€ãŒããã£ãã·ã¥ããã³ãŒãç·šéã®ãã³ã§ã¯ãªããããã§ã¹ããå€ãã£ããšãã ãåå®è¡ããŸãã--classmap-authoritative ãã©ã°ã¯ Composer ã«ã¯ã©ã¹ããããå®å
šã§ããããšãäŒããããããªãŒãããŒããŒã¯å®è¡æã«ãã¡ã€ã«ã·ã¹ãã ãžãã©ãŒã«ããã¯ããããšããããŸããããã«ãäžã«ãã£ãã·ã¥ããŠã©ãŒã ã¢ããããŠããããšã§ãæåã®æ¬çªãªã¯ãšã¹ãã¯å®å
šã«ã³ã³ãã€ã«æžã¿ã®ã³ã³ããã«å±ããŸãã
FrankenPHP ã¯ãŒã«ãŒã¢ãŒããš Symfony ã©ã³ã¿ã€ã
åŸæ¥ã® PHP-FPM 㯠Symfony ã«ãŒãã«ãèµ·åãã1 ãªã¯ãšã¹ããåŠçããŠããã¹ãŠãç Žæ£ããŸããã¯ãŒã«ãŒã¢ãŒãã¯ã«ãŒãã«ãšäŸåæ§æ³šå
¥ã³ã³ããããªã¯ãšã¹ãããŸããã§çããç¶ããŸããã¬ã€ãã³ã·åæžã®å€§åã¯ããããçãŸããŸããruntime/frankenphp-symfony ããã±ãŒãžã¯ãSymfony Runtime ã³ã³ããŒãã³ããšæšæºã® public/index.php ããŒãã¹ãã©ãããéããŠãããå®çŸããŸãã
use App\Kernel;
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
return function (array $context) {
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
};Dockerfile ã§èšå®ãã FRANKENPHP_CONFIG="worker ./public/index.php" ã®è¡ããã®ã«ãŒããæå¹åããŸããã³ã³ãããåå©çšãããããããªã¯ãšã¹ãåºæã®ç¶æ
ãä¿æãããµãŒãã¹ã¯ãªã¯ãšã¹ãéã§èªèº«ããªã»ããããªããã°ãªããŸãããSymfony ã¯ãã¬ãŒã ã¯ãŒã¯ã®ãµãŒãã¹ãèªåçã«åŠçããŸãããç¶æ
ãæã€ã«ã¹ã¿ã ãµãŒãã¹ã¯ Symfony\Contracts\Service\ResetInterface ãå®è£
ããkernel.reset ã§ã¿ã°ä»ãããŠãèç©ãããç¶æ
ãæ¬¡ã®ãªã¯ãšã¹ããžæŒãåºããªãããã«ããã¹ãã§ããããã¯é·æé皌åãã Messenger ã¯ãŒã«ãŒ ã«æ±ããããèŠåŸãšåãã§ããã®èŠè¿ããšããŠåäžããŒããŠã§ã¢ã§ PHP-FPM ã®æ°åã®ãªã¯ãšã¹ãã¹ã«ãŒããããåŸãããŸãã
ããŒã«ã«éçºã§ã¯ãFrankenPHP ã --watch ãã©ã°ä»ãã§å®è¡ãããšãã¡ã€ã«å€æŽæã«ã¯ãŒã«ãŒãèªåçã«åèµ·åãããããã¯ãŒã«ãŒã¢ãŒããç·šéãšãªãã¬ãã·ã¥ã®ã«ãŒãã®åŠšãã«ãªãããšã¯ãããŸããã
Symfony ã«ããã FrankenPHP ãš PHP-FPM ã®æ¯èŒ
FrankenPHP ãéžã¶ããåŸæ¥ã® Nginx ãš PHP-FPM ã®ã¹ã¿ãã¯ãéžã¶ãã¯ãDockerfile ãšã©ã³ã¿ã€ã ã®æåã®äž¡æ¹ãå·Šå³ããŸãã以äžã®è¡šã¯ãSymfony ã®æ¬çªæ§æã«ãããå®åäžã®éãããŸãšãããã®ã§ãã
| èŠ³ç¹ | FrankenPHP ã¯ãŒã«ãŒã¢ãŒã | Nginx + PHP-FPM | |--------|------------------------|-----------------| | ã³ã³ãã | 1 〠| 2 ã€ïŒWeb ãµãŒã㌠+ PHPïŒ | | ã«ãŒãã«èµ·å | ã¯ãŒã«ãŒããšã« 1 å | ãªã¯ãšã¹ãããšã« 1 å | | HTTP/3 | æšæºæèŒ | 远å èšå®ãå¿ èŠ | | TLS | èªåïŒCaddyïŒ | æåã§ã®èšŒææžèšå® | | ç¶æ ã®æ±ã | ãªã¯ãšã¹ãéã§ãªã»ãããå¿ èŠ | ãªã¯ãšã¹ãããšã«åé¢ | | ã³ãŒã«ãã¹ã¿ãŒãã®ã³ã¹ã | èµ·åæã«äžåºŠã ãçºç | ãªã¯ãšã¹ãããšã«çºç |
ã¯ãŒã«ãŒã¢ãŒãã¯ãã³ã¹ãã®é«ãã«ãŒãã«èµ·åãšã³ã³ããã³ã³ãã€ã«ã®ã¹ããããæ°åãªã¯ãšã¹ãã«ããã£ãŠååŽãããããã¹ã«ãŒãããã§åããŸããPHP-FPM ãäŸç¶ãšããŠæå¹ãªã®ã¯ãã°ããŒãã«å€æ°ããããã»ã¹ããªã¯ãšã¹ãããšã«æ°èŠã§ããåæã®ãµãŒãããŒãã£ã©ã€ãã©ãªã«äŸåããã¢ããªã±ãŒã·ã§ã³ã®å Žåã§ãããããã¯åå©çšãããã¯ãŒã«ãŒã®ããšã§ã¯ç Žç¶»ããããã§ãã
ãªã¯ãšã¹ãããŒã¿ããã©ã€ããŒãããããã£ã«ãã£ãã·ã¥ãããµãŒãã¹ã¯ããªã»ããããªãéãããããªã¯ãšã¹ãã®ããŒã¿ã次ã®ãªã¯ãšã¹ããžæž¡ããŠããŸããŸããæ¬çªã§ã¯ãŒã«ãŒã¢ãŒãã«åãæ¿ããåã«ãã·ã³ã°ã«ãã³ãã€ãã³ããµãã¹ã¯ã©ã€ããŒããããŠã»ãã¥ãªãã£ããŒã¯ã³ãçŸåšã®ãªã¯ãšã¹ããä¿æãããããããã®ãç£æ»ããŠãã ããã
Symfonyã®é¢æ¥å¯Ÿçã¯ã§ããŠããŸããïŒ
ã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã¿ãŒãflashcardsãæè¡ãã¹ãã§ç·Žç¿ããŸãããã
æ¬çªç°å¢ã§ã®ç°å¢å€æ°ãšã·ãŒã¯ã¬ããã®ç®¡ç
Symfony ã¯ç°å¢å€æ°ããèšå®ãèªã¿èŸŒã¿ãŸããæ¬çªã§ããããäŸçµŠããå¥å šãªæ¹æ³ã¯ 2 ã€ãããŸãã1 ã€ç®ã¯ãªãŒã±ã¹ãã¬ãŒã¿ãŒã Compose ãã¡ã€ã«ãéããŠãã¬ãŒã³ãªå€æ°ãæ³šå ¥ããæ¹æ³ã§ãã2 ã€ç®ã¯ Symfony ã®æå·åã·ãŒã¯ã¬ãããã«ãã§ãæ©åŸ®ãªå€ãæå·æãšããŠãªããžããªã«ä¿åããå®è¡æã«åäžã®ç§å¯éµã§åŸ©å·ããŸãã
# Generate the keypair; commit the public key, keep the private key out of the image
php bin/console secrets:generate-keys
# Encrypt a value into config/secrets/prod/
php bin/console secrets:set DATABASE_URL
# In production, expose only the decryption key to the container
export SYMFONY_DECRYPTION_SECRET="$(cat config/secrets/prod/prod.decrypt.private.php)"Dockerfile å
ã® composer dump-env prod ã®ã¹ããã㯠.env ãã¡ã€ã«çŸ€ãæé©åãããåäžã® .env.local.php ã«ã³ã³ãã€ã«ããèµ·åæã« dotenv ãã¡ã€ã«ãè§£æããå®è¡æã³ã¹ããåãé€ããŸããå®éã®ã³ã³ããç°å¢ã§èšå®ããã倿°ã¯ãã³ã³ãã€ã«æžã¿ã®æ¢å®å€ãäŸç¶ãšããŠäžæžãããããããªãŒã±ã¹ãã¬ãŒã¿ãŒãæäŸããã·ãŒã¯ã¬ãããåžžã«åªå
ãããŸããSymfony ãããã€ã¬ã€ã ãåªå
é äœã®å
šäœåã説æããŠããŸãããå®åäžã®ã«ãŒã«ã¯ã·ã³ãã«ã§ããAPP_SECRET ãããŒã¿ããŒã¹èªèšŒæ
å ±ãæ±ºããŠã€ã¡ãŒãžã«çŒã蟌ãŸããã³ã³ããèµ·åæã«æ³šå
¥ããããšã§ãã
Symfony æ¬çªã€ã¡ãŒãžã®æé©å
æ¬çªã®ããã©ãŒãã³ã¹å·®ã®å€§å㯠2 ã€ã® OPcache èšå®ã§èª¬æã§ããŸããã¿ã€ã ã¹ã¿ã³ãæ€èšŒã®ç¡å¹åãšãããªããŒãã®æå¹åã§ããã³ã³ããã€ã¡ãŒãžã¯äžå€ã§ããããããœãŒã¹ãå®è¡æã«å€ããããšã¯ãªããOPcache ãç·šéã確èªããããã«ãã¡ã€ã«ã stat ããå¿ èŠã¯äžåãããŸãããããªããŒãã¯ããã«èžã¿èŸŒãã§ãSymfony ãšã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã¹ããµãŒããŒèµ·åæã«äžåºŠã ãå ±æã¡ã¢ãªãžèªã¿èŸŒã¿ãŸãã
; docker/php/prod.ini
opcache.enable=1
opcache.preload=/app/var/cache/prod/App_KernelProdContainer.preload.php
opcache.preload_user=root
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0 ; immutable image: never re-check the filesystem
realpath_cache_size=4096K
realpath_cache_ttl=600Symfony ã¯äžã«æãã preload.php ãã¡ã€ã«ã cache:warmup ã®éã«çæããããããã«ãåŸã«ã¯ãã®ãã¡ã€ã«ããã§ã«ã€ã¡ãŒãžå
ã«ååšããŸããOPcache ããªããŒã ã¯ãããã®ã¯ã©ã¹ãèµ·åæã«ãªã³ã¯ããããããå¿
èŠãšããæåã®ãªã¯ãšã¹ãã§ã®ã³ã³ãã€ã«æé ãçããŸããvalidate_timestamps=0 ã®èšå®ãå®å
šãªã®ã¯ãæ°ãããªãªãŒã¹ãæ°ããã€ã¡ãŒãžãæå³ããäžå€ãããã€ã«éãããŸããå¯å€ãã¹ãã§ã¯å€ãã³ãŒããé
ä¿¡ããŠããŸããŸããmax_accelerated_files ãå®éã®ãã¡ã€ã«æ°ãã倧ããèšå®ããŠããã°ããã¬ãŒã ã¯ãŒã¯å
šäœããšãã¯ã·ã§ã³ãããããšãªããã£ãã·ã¥ããç¶ããŸãã
.dockerignore ã«ãã Symfony ã€ã¡ãŒãžãµã€ãºã®åæž
.dockerignore ãã¡ã€ã«ãæ¬ ããŠãããšããã«ãã¯éãã«è¥å€§åããŸããããããªããã°ãCOPY . . ã®ã¹ãããã¯ããŒã«ã«ã® vendor ãã£ã¬ã¯ããªãéçºæã® var/cacheãããŒãã®ãã«ãåºåããã㊠.git ã®å±¥æŽããã®ãŸãŸã€ã¡ãŒãžãšãã«ãã³ã³ããã¹ããžéã蟌ã¿ãŸããããããé€å€ããã°ã€ã¡ãŒãžãå°ãããªãããã«ãã³ã³ããã¹ãã®ããŒã¢ã³ãžã®ã¢ããããŒããéããªããéçºæã®ææç©ãæ°ãã«ã€ã³ã¹ããŒã«ãããæ¬çªäŸåãäžæžãããã®ãé²ããŸãã
# .dockerignore
/.git/
/vendor/
/node_modules/
/var/
/.env.local
/.env.*.local
/tests/
/docker/
compose*.yaml
Dockerfileãã£ãšãéèŠãªã®ã¯ /vendor/ ãç¡èŠããããšã§ããæ¬çªã¹ããŒãžã¯ composer install --no-dev ãå®è¡ããããããã¹ãã®éçºä»æ§ã® vendor ãã£ã¬ã¯ããªãéã蟌ããšããã®ã¹ããããå®å
šã«å°ç¡ãã«ãªã£ãŠããŸããŸãã/var/ ãé€å€ããã°éçºæã®ãã£ãã·ã¥ãšãã°ãã€ã¡ãŒãžããæé€ããããã«ãæã® cache:warmup ãã¯ãªãŒã³ãªæ¬çªãã£ãã·ã¥ãçæã§ããŸãããã«ãã¹ããŒãžãã«ããš Alpine ããŒã¹ã®æ¡åŒµãšçµã¿åãããã°ãç¡é§ã®ãªã Symfony ã€ã¡ãŒãžã¯éåžž 150 MB ãååã«äžåããŸãã
Symfony ã³ã³ããã®ãããã€ãšãã€ã°ã¬ãŒã·ã§ã³ã®å®è¡
æ¬çªçšã® Compose ãã¡ã€ã«ã¯ãããŒã«ã«ã§ãã«ãããã®ã§ã¯ãªãã¬ãžã¹ããªã®ãã«ãæžã¿ã€ã¡ãŒãžãåç §ããå¿çããã³ã³ããã«ã®ã¿ãªãŒã±ã¹ãã¬ãŒã¿ãŒããã©ãã£ãã¯ãã«ãŒãã£ã³ã°ããããã«ãã«ã¹ãã§ãã¯ãå®çŸ©ããŸããã·ãŒã¯ã¬ããã¯ã€ã¡ãŒãžã¬ã€ã€ãŒãšããŠã§ã¯ãªããç°å¢å€æ°ãšããŠå±ããããŸãã
# compose.prod.yaml
services:
php:
image: registry.example.com/app:${TAG}
environment:
APP_ENV: prod
APP_SECRET: ${APP_SECRET}
DATABASE_URL: ${DATABASE_URL}
healthcheck:
test: ["CMD", "curl", "-fsS", "http://localhost/health"]
interval: 10s
timeout: 3s
retries: 3
restart: unless-stoppedãã«ã¹ãã§ãã¯ã¯ /health ã«ãŒãã« curl ãéããããã¢ããªã±ãŒã·ã§ã³ã¯ãã®ã«ãŒããå
¬éããå¿
èŠããããŸããããŒã¿ããŒã¹ã«è§Šããã« 200 ãè¿ãæå°éã®ã³ã³ãããŒã©ãŒã§ããã°ããã§ãã¯ã¯é«éã«ä¿ãããããŒã¿ããŒã¹ã®äžæçãªäžèª¿ã®ããã ã«ã³ã³ãããç°åžžãšå€å®ãããã®ãé¿ããããŸããããŒã¿ããŒã¹ã®æºåç¶æ
ãéèŠãªå Žåã¯ã2 ã€ç®ã®ããæ·±ããããŒãã軜éãªã¯ãšãªãå®è¡ã§ããŸãããçå確èªã®ãšã³ããã€ã³ãã¯åçŽãªãŸãŸã«ããŠãããŸãã
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;
final class HealthController extends AbstractController
{
#[Route('/health', name: 'health', methods: ['GET'])]
public function __invoke(): JsonResponse
{
return new JsonResponse(['status' => 'ok']);
}
}ããŒã¿ããŒã¹ã®ãã€ã°ã¬ãŒã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èµ·åäžã§ã¯ãªããæ°ããã³ã³ããããã©ãã£ãã¯ãåãåãåã®ç¬ç«ããã¹ããããšããŠå®è¡ããã¹ãã§ããäœ¿ãæšãŠã®ã³ã³ããã§å®è¡ããã°ãè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã¬ããªã«ã䞊è¡ããŠèµ·åããå Žåã§ããã¹ããŒãããªãªãŒã¹ããšã«ã¡ããã©äžåºŠã ãææ°åãããããšãä¿èšŒãããŸãã
# deploy.sh
set -euo pipefail
docker compose -f compose.prod.yaml pull
# Apply migrations once, in an isolated container
docker compose -f compose.prod.yaml run --rm php \
bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration
# Start replicas and wait for the health check to pass
docker compose -f compose.prod.yaml up -d --wait--wait ãã©ã°ã¯ãã¹ãŠã®ãµãŒãã¹ãæ£åžžãå ±åãããŸã§ãããã¯ããæãã£ã±ãªãã®èµ·åã§ã¯ãªãæ¬ç©ã®æåã·ã°ãã«ããããã€ã¹ã¯ãªããã«äžããŸããããã Kubernetes ã Docker Swarm ã®ãããªãªãŒã±ã¹ãã¬ãŒã¿ãŒã§ã®ããŒãªã³ã°ã¢ããããŒããšçµã¿åãããã°ããŒãããŠã³ã¿ã€ã ã®ãªãªãŒã¹ãå®çŸããŸããæ°ããã³ã³ããããã«ã¹ãã§ãã¯ãééãããŸã§ãå€ãã³ã³ãããé
ä¿¡ãç¶ããããã§ãããã®ã¯ãŒã¯ãããŒã察象ãšãããã¬ãŒã ã¯ãŒã¯ããŒãžã§ã³ã®å
šäœåã«ã€ããŠã¯ãSymfony ãã©ãããã©ãŒã æŠèŠ ãš Symfony 8 ãš PHP 8.4 ã®æ©èœã¬ã€ã ããçŸè¡ãªãªãŒã¹ã©ã€ã³ã§äœãå€ãã£ãã®ããæ±ã£ãŠããŸãã
ãŸãšã
- ãã«ãã¹ããŒãž Dockerfile ã䜿ããéçºã€ã¡ãŒãžãšæ¬çªã€ã¡ãŒãžã 1 ã€ã®ããŒã¹ãå ±æãã€ã€ãæ¬çªã¿ãŒã²ãã㯠Composer ã®éçºäŸåãªãã§é åžãã
- ãœãŒã¹ããå
ã«
composer.jsonãšããã¯ãã¡ã€ã«ãã³ããŒããã³ãŒã倿ŽããŸããã§äŸåã€ã³ã¹ããŒã«ã®ã¬ã€ã€ãŒããã£ãã·ã¥ã«ä¿ã€ - FrankenPHP ãã¯ãŒã«ãŒã¢ãŒãã§å®è¡ããŠèµ·åæžã¿ã«ãŒãã«ããªã¯ãšã¹ãéã§åå©çšãã
ResetInterfaceã§ç¶æ ãæã€ãµãŒãã¹ããªã»ããããŠç¶æ æŒããé²ã - ãã«ãæã« Symfony ãã£ãã·ã¥ããŠã©ãŒã ã¢ãããã
dump-env prodã§.envãã³ã³ãã€ã«ããŠã皌åããã³ã³ãããå®å šã«åæåãããç¶æ ã§èµ·åããããã«ãã - æ¬çªã§ã¯ OPcache ããªããŒããæå¹åã
validate_timestamps=0ãèšå®ãããããã¯ã€ã¡ãŒãžãäžå€ã§ããããããå®å šã§ãã APP_SECRETãããŒã¿ããŒã¹èªèšŒæ å ±ããã«ãã®åŸ©å·éµãã€ã¡ãŒãžã¬ã€ã€ãŒããæé€ããã³ã³ããèµ·åæã«ç°å¢å€æ°ãšããŠæ³šå ¥ãã- Doctrine ãã€ã°ã¬ãŒã·ã§ã³ã¯æ°ããã¬ããªã«ããã©ãã£ãã¯ãåãåãåã«äœ¿ãæšãŠã®ã³ã³ããã§é©çšãã
up -d --waitã§ãã«ã¹ãã§ãã¯ãæ¡ä»¶ã«ããŒã«ã¢ãŠããå¶åŸ¡ãã
ä»ããç·Žç¿ãå§ããŸãããïŒ
颿¥ã·ãã¥ã¬ãŒã¿ãŒãšæè¡ãã¹ãã§ç¥èããã¹ãããŸãããã
ã¿ã°
å ±æ
é¢é£èšäº

Symfony 8ã®æ°æ©èœã培åºè§£èª¬ïŒPHP 8.4ã¬ã€ãžãŒãªããžã§ã¯ãããã«ãã¹ããããã©ãŒã ã颿¥å¯ŸçãŸã§
Symfony 8ã¯PHP 8.4ãå¿ é ãšãããã€ãã£ãã¬ã€ãžãŒãªããžã§ã¯ããAbstractFlowTypeãåŒã³åºãå¯èœã³ãã³ããªã©å€æ°ã®æ°æ©èœãæèŒããŠããŸããæ¬èšäºã§ã¯äž»èŠæ©èœãã³ãŒãäŸãšãšãã«è§£èª¬ãã2026幎ã®é¢æ¥å¯Ÿçãã€ã³ãã玹ä»ããŸãã

Doctrine ORM:Symfonyã«ããããªã¬ãŒã·ã§ã³ã®ãã¹ã¿ãŒ
Symfonyã«ãããDoctrine ORMãªã¬ãŒã·ã§ã³ã®å®å šã¬ã€ããOneToManyãManyToManyãããŒãæŠç¥ãããã©ãŒãã³ã¹æé©åãå®äŸãšãšãã«è§£èª¬ããŸãã

Symfony颿¥è³ªåé: 2026幎ããã25
æãå€ãå°ããããSymfony颿¥è³ªå25éžãã¢ãŒããã¯ãã£ãDoctrine ORMããµãŒãã¹ãã»ãã¥ãªãã£ããã©ãŒã ããã¹ãã詳现ãªåçãšã³ãŒãäŸãšãšãã«è§£èª¬ã