m1macで2つの個別リポジトリで1つのdbを共有しているphp+laravel+mysqlのdocker環境構築
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が通らなかったので(たまたまかもしれません)一応別のユーザーも作りました。。
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;
[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.7
とplatform: linux/x86_64
のコンボで接続できると見かけたのですが、どうしてもコンテナがexitしてしまい立ち上がらず😿
image: mysql/mysql-server:5.7
にしました。
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が通らないので注意
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
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にいれるのがなかなか苦戦しました( '-' )
FROM php:8.0-fpm
COPY /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に↓を追記
&& sed -i -e 's/domain="coder" rights="none"/domain="coder" rights="write|read"/g' /etc/ImageMagick-6/policy.xml
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