1. Dockerfile (多段階)
FROM php:8.4-fpm-alpine AS base
RUN apk add --no-cache libpq-dev \
&& docker-php-ext-install pdo_pgsql opcache
FROM base AS composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /app
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --prefer-dist
FROM base AS runtime
WORKDIR /app
COPY --from=composer /app/vendor ./vendor
COPY . .
RUN php artisan config:cache \
&& php artisan route:cache \
&& php artisan view:cache
EXPOSE 9000
CMD ["php-fpm"]
2.Docker Compose
services:
app:
build: .
volumes:
- .:/app
depends_on:
- db
- redis
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
- .:/app
depends_on:
- app
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: ${DB_DATABASE}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7-alpine
queue:
build: .
command: php artisan queue:work --tries=3 --timeout=90
depends_on:
- db
- redis
volumes:
pgdata:
3. GitHub アクション CI/CD
name: Laravel CI/CD
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_DB: testing
POSTGRES_USER: test
POSTGRES_PASSWORD: test
ports: ["5432:5432"]
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with:
php-version: "8.4"
extensions: pdo_pgsql
- run: composer install --no-interaction
- run: cp .env.testing .env
- run: php artisan key:generate
- run: php artisan test --parallel --coverage --min=80
env:
DB_CONNECTION: pgsql
DB_HOST: 127.0.0.1
DB_DATABASE: testing
DB_USERNAME: test
DB_PASSWORD: test
deploy:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy
run: |
ssh ${{ secrets.SERVER }} "cd /app && git pull && composer install --no-dev && php artisan migrate --force && php artisan optimize"
次の記事: 実稼働環境の導入と監視。