2022-05-04

PHP・Composer のない環境で既存の Laravel プロジェクトに Laravel Sail を導入する

服を買いに行く服が無い状態になりがちなので、手順をメモ

前提

  • アプリケーションが PHP 7.4 もしくは PHP 8.0 以上で動作すること
  • Docker および Docker Compose が利用できること

環境変数の設定

bash

cp .env.example .env

.env

# 必須
WWWUSER=1000
WWWGROUP=1000

# 任意
APP_PORT=8000 # デフォルトは 80
FORWARD_DB_PORT=33060 # デフォルトは 3306

Laravel Sail 含む依存パッケージのインストール

bash

docker run --rm \
    -v "$(pwd)":/opt \
    -w /opt \
    laravelsail/php80-composer:latest \
    bash -c \
    "composer install && \
     php artisan key:generate && \
     composer require laravel/sail --dev && \
     php ./artisan sail:install --with=mysql,redis,meilisearch,mailhog,selenium && \
     php ./artisan sail:publish"
sudo chown -R $USER: .
  • Docker イメージの PHP バージョンは適宜置き換える
  • sail:install--with オプションで必要なイメージを選択

docker-compose.yaml の設定

  • PHP のバージョンを環境に合わせて修正する
  • DB のバージョン等も必要に応じて変更する

以下は PHP 8.0 を利用する場合

docker-compose.yaml

version: '3'
services:
    laravel.test:
        build:
            # PHP バージョンを指定
            context: ./docker/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        # イメージ名称のバージョンも修正しておく
        image: sail-8.0/app
# 省略

Dockerfile の設定

docker-compose.yaml で指定した Dockerfile を修正する

  • 6行目付近: Node.js のバージョン指定
  • 7行目付近: PosgreSQL のバージョン指定
  • 12行目付近: タイムゾーン指定 (JTCに合わせる場合は Asia/Tokyo )
  • そのほか、アプリで不要なモジュール(Node・Yarn・MySQL Client・PostgreSQL Client・PHPの拡張モジュールなど)が存在する場合はインストールコマンドを消しておくとイメージを軽量化できる

docker/8.0/Dockerfile

FROM ubuntu:21.10

LABEL maintainer="Taylor Otwell"

ARG WWWGROUP
ARG NODE_VERSION=16
ARG POSTGRES_VERSION=14

WORKDIR /var/www/html

ENV DEBIAN_FRONTEND noninteractive
ENV TZ=UTC

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update \
    && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 \
    && mkdir -p ~/.gnupg \
    && chmod 600 ~/.gnupg \
    && echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \
    && apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0x14AA40EC0831756756D7F66C4F4EA0AAE5267A6C \
    && echo "deb https://ppa.launchpadcontent.net/ondrej/php/ubuntu impish main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
    && apt-get update \
    && apt-get install -y php8.0-cli php8.0-dev \
       php8.0-pgsql php8.0-sqlite3 php8.0-gd \
       php8.0-curl php8.0-memcached \
       php8.0-imap php8.0-mysql php8.0-mbstring \
       php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \
       php8.0-intl php8.0-readline php8.0-pcov \
       php8.0-msgpack php8.0-igbinary php8.0-ldap \
       php8.0-redis php8.0-swoole php8.0-xdebug \
    && php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
    && curl -sL https://deb.nodesource.com/setup_$NODE_VERSION.x | bash - \
    && apt-get install -y nodejs \
    && npm install -g npm \
    && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
    && echo "deb http://apt.postgresql.org/pub/repos/apt impish-pgdg main" > /etc/apt/sources.list.d/pgdg.list \
    && curl --silent -o - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
    && apt-get update \
    && apt-get install -y yarn \
    && apt-get install -y mysql-client \
    && apt-get install -y postgresql-client \
    && apt-get -y autoremove \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN update-alternatives --set php /usr/bin/php8.0

RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.0

RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail

COPY start-container /usr/local/bin/start-container
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY php.ini /etc/php/8.0/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container

EXPOSE 8000

ENTRYPOINT ["start-container"]

イメージのビルド

ネットワーク速度やスペックに依りますが、初回ビルドは時間がかかります

bash

docker-compose up

以上