Docker✕CakePHP環境を整えたい(postgres・Apache)

投稿者:

こんばんは、ねこぐらしです。
MENTAの契約者様でdockerでCakePHPを構築したいとのことで、
記事を作成しようと思います。
解説の内容と動作が異なる場合は、必ずリファレンスを確認してください。

※すでにDockerがインストールされていることを前提の手順です。

各アプリケーション一覧

  • CakePHP3.9.*
  • Postgres
  • Apache2

ディレクトリ作成

今回は、cake_starterというディレクトリ名で作成さいます。
自分のプロジェクトにあわせて全置換お願いします。

mkdir cake_project

Dockerfileとdocker-compose.ymlの作成

さきほど作成したディレクトリ直下にDockerfileとdocker-compose.ymlを作成してください。

Dockerfileに以下コードを貼付けお願いします。

FROM php:7.4-apache

# apache
ENV APACHE_DOCUMENT_ROOT /var/www/html/cake_project/webroot
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf \
    && sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf \
    && a2enmod rewrite
ENV DEBCONF_NOWARNINGS=yes
RUN apt-get update && apt-get install -y \
    libicu-dev \
    zip \
    unzip \
    libpq-dev \
    && docker-php-ext-install -j$(nproc) intl \
    && docker-php-ext-install -j$(nproc) pdo_pgsql
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
COPY . /var/www/html
ENV COMPOSER_ALLOW_SUPERUSER 1
COPY --from=composer /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html/cake_project

次に、docker-compose.ymlを作成します。

version: "3"
services:
  web:
    container_name: web
    build: .
    volumes:
      - ./web:/var/www/html/cake_project
    ports:
      - "80:80"
  db:
    image: postgres:latest
    container_name: db
    environment:
      POSTGRES_DB: db
      POSTGRES_ROOT_PASSWORD: password
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    ports:
      - 5432:5432
    volumes:
      - ./db:/var/lib/postgresql/data

コンテナのビルドと起動

docker-compose.ymlが設置されているディレクトリで下記を実行してください。

docker-compose up -d

初回起動にはイメージのダウンロードなどがあるため、
5分ほどかかりますので、コーヒーでも淹れて待ちましょう

ビルドが終わるとDocker for desktopをしようしている方はダッシュボードを確認するとコンテナが起動していることが確認できます。

以上でdockerは完了です。
次にCakePHPをインストールしましょう。

CakePHPインストール

webコンテナにbashでログイン

docker exec -it web bash

webコンテナにログインができたら下記のコマンドでCakePHPをインストールしてください。

composer create-project --prefer-dist cakephp/app:3.9.* .

途中でパーミッションについて聞かれるので「Y」と入力お願いします。
インストールが完了すると「web」ディレクトリにCakePHPのファイルが作成されます。

インストール途中で、以下のようにパーミッションについてきかれるので、
「Y」を入力してください。

インストール中にワーニングが出たとおもうので、対処したいと思います。

このままでも問題ないですが、Composerコマンドを使用するたび表示されていて、エラーをそのままにするのもいかがものなのかと思います。
以下ファイルを開き指定行を削除しましょう。

"post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump",

全体の場所は、以下の通りです。

    "scripts": {
        "post-install-cmd": "App\\Console\\Installer::postInstall",
        "post-create-project-cmd": "App\\Console\\Installer::postInstall",
    //以下の行を削除
        "post-autoload-dump": "Cake\\Composer\\Installer\\PluginInstaller::postAutoloadDump",
        "check": [
            "@test",
            "@cs-check"
        ],
        "cs-check": "phpcs --colors -p --extensions=php --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/ config/ webroot/",
        "cs-fix": "phpcbf --colors -p --extensions=php --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/ config/ webroot/",
        "stan": "phpstan analyse -l 5 src/",
        "stan-setup": "cp composer.json composer.backup && composer require --dev phpstan/phpstan-shim:^0.11 && mv composer.backup composer.json",
        "test": "phpunit --colors=always"
    },

http://localhost/へアクセスするとCakePHPのエラーが表示されます。
下記対応しましょう。

CakePHPのDB設定

下記ファイル(web/config/app.php)にdocker-compose.ymlに記述したDB接続設定とPostgresの設定を記載していきましょう。

      POSTGRES_DB: db
      POSTGRES_ROOT_PASSWORD: password
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password

-(マイナス)が修正前で、+(プラス)は修正後になります・

//use Cake\Database\Driver\Mysql;
use Cake\Database\Driver\Postgres;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    'Datasources' => [
        'default' => [
            'className' => Connection::class,
            - 'driver' => Mysql::class,
            + 'driver' => Postgres::class,
            'persistent' => false,
            - 'host' => 'localhost',
            + 'host' => 'db',
            /*
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',
            /*
             * It is recommended to set these options through your environment or app_local.php
             */
            - //'username' => 'my_app',
            - //'password' => 'secret',
            - //'database' => 'my_app',
            + 'username' => 'my_app',
            + 'password' => 'secret',
            + 'database' => 'my_app',
            /*
             * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6).
             */
            //'encoding' => 'utf8mb4',
            'timezone' => 'UTC',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,

            /*
             * Set identifier quoting to true if you are using reserved words or
             * special characters in your table or column names. Enabling this
             * setting will result in queries built using the Query Builder having
             * identifiers quoted when creating SQL. It should be noted that this
             * decreases performance because each query needs to be traversed and
             * manipulated before being executed.
             */
            'quoteIdentifiers' => false,

            /*
             * During development, if using MySQL < 5.6, uncommenting the
             * following line could boost the speed at which schema metadata is
             * fetched from the database. It can also be set directly with the
             * mysql configuration directive 'innodb_stats_on_metadata = 0'
             * which is the recommended value in production environments
             */
            //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],

            'url' => env('DATABASE_URL', null),
        ],

        /*
         * The test connection is used during the test suite.
         */
        'test' => [
            'className' => Connection::class,
            - 'driver' => Mysql::class,
            + 'driver' => Postgres::class,
            'persistent' => false,
            - 'host' => 'localhost',
            + 'host' => 'db',
            //'port' => 'non_standard_port_number',
            - 'username' => 'my_app',
            - 'password' => 'secret',
            - 'database' => 'test_myapp',
            + 'username' => 'postgres',
            + 'password' => 'password',
            + 'database' => 'db',
            //'encoding' => 'utf8mb4',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
            'quoteIdentifiers' => false,
            'log' => false,
            //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
            'url' => env('DATABASE_TEST_URL', null),
        ],
    ],

再度 http://localhost/ へアクセスするとWelcomeページが表示されます。

赤い線をつけたところを確認してください。
データベースのエラーが出ていますので、修正しましょう。
先ほど編集したapp.phpと同じディレクトリにあるapp_local.phpを修正します。

前回と同じく-(マイナス)が修正前で、+(プラス)は修正後になります。

    /*
     * Connection information used by the ORM to connect
     * to your application's datastores.
     *
     * See app.php for more configuration options.
     */
    'Datasources' => [
        'default' => [
            - 'host' => 'localhost',
            + 'host' => 'db',
            /*
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',
            - 'username' => 'my_app',
            - 'password' => 'secret',
            - 'database' => 'my_app',
            + 'username' => 'postgres',
            + 'password' => 'password',
            + 'database' => 'db',
            'log' => true,
            'url' => env('DATABASE_URL', null),
        ],
    ],

再度 http://localhost/ へアクセスするとDB接続に成功しています。

これでセットアップは完了です。

最後に

最後に、今回は、Postgresでセットアップしていますが、Mysqlでも構築しますので、
しばらくお待ちください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です