Closed1

m1macで2つの個別リポジトリで1つのdbを共有しているphp+laravel+mysqlのdocker環境構築

fuwakanifuwakani

docker初心者のため、だいぶふんわりしている設定です。。。
mysqlのimageで苦戦して何時間もかかってしまったので以降気をつけたい( ´~` )

やりたいこと

  • 2つの個別のGitリポジトリで1つのdbを共有している(webとcrmとする)
    • 片方のリポジトリにmigrationファイルがある(webにmigrationファイルがある)
  • php gd / ImageMagickを入れる

環境 🖥

  • m1チップのmac
  • php
  • laravel
  • mysql5.7

docker networkを使ってネットワークを共有する

2つのリポジトリで1つのdbを共有しているので複数の Docker Compose 環境でネットワークを共有するを参考にdocker-compose.yamlファイルを作成していきます

mysqlについて

shinoyuさんM1 DockerでMySQLを含んだ環境を動かすためにやったことの通り設定しました

dockerを立ち上げた後にrootユーザーを使うときは権限エラーでmigrationが通らなかったので(たまたまかもしれません)一応別のユーザーも作りました。。

allow-host
Create USER root@'%';
GRANT ALL PRIVILEGES ON *.* TO root@'%' identified by 'password' WITH GRANT OPTION;
Create USER docker@'%';
GRANT ALL PRIVILEGES ON *.* TO docker@'%' identified by 'password' WITH GRANT OPTION;

my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit_defaults_for_timestamp = true
user=docker

[client]
default-character-set=utf8mb4

web側の設定

mysqlのimageなのですがimage: mysql5.7platform: linux/x86_64のコンボで接続できると見かけたのですが、どうしてもコンテナがexitしてしまい立ち上がらず😿
image: mysql/mysql-server:5.7にしました。

docker-compose.yaml
version: '3.9'
services:
  mysql:
    image: mysql/mysql-server:5.7
    ports:
      - '3306:3306'
    volumes:
      - ./docker/db/allow-host.sql:/docker-entrypoint-initdb.d/allow-host.sql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_DATABASE: test
      MYSQL_USER: docker
      MYSQL_PASSWORD: password
      MYSQL_ROOT_HOST: '%'   # rootユーザーを使う場合これで通る時もある...?
      MYSQL_ROOT_PASSWORD: password
      TZ: 'Asia/Tokyo'
    networks:
      - external
    container_name: test_db
    command: mysqld --innodb_use_native_aio=0   # 謎エラーが落ち着く
  php:
    build: .
    volumes:
      - .:/var/www
    working_dir: /var/www
    ports:
      - '8000:8000'
    container_name: test_web
    depends_on:
      - mysql
    networks:
      - external
networks:
  external:
    driver: bridge
    internal: false
    name: test_network

🔎 docker-compose.yamlファイルと設定が合うようにしないとmigrationが通らないので注意

.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=docker
DB_PASSWORD=password

crm側の設定

  • php gdとImageMagickを使えるようにする
  • migrationファイルはない
    • .envファイルのDB設定はweb側と一緒でOK
docker-compose.yaml
version: '3.9'

services:
  php:
    build: .
    volumes:
      - .:/var/www
    working_dir: /var/www
    ports:
      - '8080:8080'
    networks:
      - external
    container_name: test_crm

networks:
  external:
    name: test_network
    external: true

いろいろ試してbuildで落ちなかったのは↓でした
ImageMagickをdockerにいれるのがなかなか苦戦しました( '-' )

Dockerfile
FROM php:8.0-fpm

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

RUN apt-get update \
    && apt-get install -y libzip-dev unzip libfreetype6-dev libjpeg62-turbo-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install zip pdo pdo_mysql -j$(nproc) gd \
    && apt-get install -y zlib1g-dev libpq-dev imagemagick libmagickwand-dev \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && sed -i -e 's/domain="coder" rights="none"/domain="coder" rights="write|read"/g' /etc/ImageMagick-6/policy.xml

ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www

🔎 ImageMagickを使うときに脆弱性対策で下記エラーが出るのですが

attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/421

ImageMagick の policy.xmlの一部をコメントアウトする方法がわからず…
Dockerfileとenvに追記で動くようになりました🐳

Dockerfileに↓を追記

Dockerfile
&& sed -i -e 's/domain="coder" rights="none"/domain="coder" rights="write|read"/g' /etc/ImageMagick-6/policy.xml

envに↓を追記

.env
PHP_FPM_INSTALL_IMAGEMAGICK=true
WORKSPACE_INSTALL_IMAGEMAGICK=true

buildし直す場合

ありとあらゆるものを一旦消す🌬

$ docker container prune
$ docker volume prune
$ docker image prune
$ docker network prune
$ docker system prune -a

?

docker-compose.yamlと.envのmysqlの設定があっているにもかかわらずmigrationコマンドを打とうとすると

SQLSTATE[HY000] [2002] Connection refused

が出てしまう場合、4つコマンドを打つと直る場合がある(なぜかはわからないですが私はいつもこれで直ります…)

$ docker exec test_web php composer.phar dump-autoload
$ docker exec test_web php artisan clear-compiled
$ docker exec test_web php artisan optimize
$ docker exec test_web php artisan config:cache
このスクラップは2022/07/16にクローズされました