こんにちは。
Dockerを使ったLaravelの開発環境を構築していて、
# php artisan migrate
を実行すると、[PDOException]SQLSTATE[HY000] [2002] No such file or directoryとエラーが出て困っていませんか?
この記事では、その原因や対処方法を紹介します。
エラーの原因
このエラーが出るのはは、web用コンテナとDB用コンテナの通信ができていないのが原因です。
エラーの対処法
最終的にdocker-compose.ymlに、必要な記述を書き足していきます。
次の手順でやってみてください。
手順1:MySQLのコンテナに入り、ソケットファイルの場所を確認する
ソケットファイルとは、「.sock」で終わるファイルです。
環境によって、「mysql.sock」だったり、「mysqld.sock」だったりするので、エラーメッセージをよく見てファイル名を確認します。
※僕の場合はmysqld.sockでした。
まずは次のコマンドでMySQLコンテナに入りましょう。
$ docker exec -it MySQLコンテナ名 /bin/bash
調べてみると、mysqld.sockの場所は/var/run/mysqld/mysqld.sockにあるらしい。
早速、ディレクトリを移動して確かめましょう。
# cd /var/run/mysqld/
# ls
lsコマンドで表示されたリスト内に、mysqld.sockがあればOKです!
手順2:docker-compose.ymlを編集する
僕の場合は最終的に次のようなdocker-compose.ymlが出来上がりました。
version: '2'
services:
laravel_mariadb:
container_name: laravel_mariadb
image: mariadb
ports:
- 3306:3306
volumes:
- ./docker/mariadbdata:/var/lib/mariadb
- ./initdb.d:/docker-entrypoint-initdb.d
- dbsocket:/var/run/mysqld
environment:
- MYSQL_ROOT_PASSWORD=Password01
- DB_SOCKET=/var/run/mysqld/mysqld.sock
# command: "--innodb_use_native_aio=0"
laravel_phpmyadmin:
container_name: laravel_phpmyadmin
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=laravel_mariadb
- PMA_USER=root
- PMA_PASSWORD=Password01
links:
- laravel_mariadb
ports:
- 8088:80
volumes:
- ./docker/phpmyadmin/sessions:/sessions
laravel_php:
container_name: laravel_php
build:
context: .
dockerfile: dockerfile
volumes:
- ./php.ini:/usr/local/etc/php/php.ini
- ./docker/html:/var/www/html
- dbsocket:/var/run/mysqld
links:
- laravel_mariadb
ports:
- 8089:80
volumes:
mariadbdata:
driver: local
dbsocket:
laravel_mariadbコンテナに追加したのは次の部分です。
volumes:
- dbsocket:/var/run/mysqld
environment:
- MYSQL_ROOT_PASSWORD=Password01
- DB_SOCKET=/var/run/mysqld/mysqld.sock
laravel_phpコンテナに追加したのは次の部分です。
volumes:
- dbsocket:/var/run/mysqld
一番最後にあるvolumes:の部分に、「dbsocket:」を追加します。
volumes:
mariadbdata:
driver: local
dbsocket:
手順3:.envとdatabase.phpを確認する
コンテナ間通信ができても、接続情報が間違っていたら繋がらないので、念のために.envとdatabase.phpも確認しましょう。
.env
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_app DB_USERNAME=root DB_PASSWORD=Password01
database.php
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'laravel_app'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'Password01'),
'unix_socket' => env('DB_SOCKET', '/var/run/mysqld/mysqld.sock'),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_general_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
最後にコンテナとimageを削除して、docker-compose up -dからphp artisan migrateまでをやり直してみます。
php artisan migrateが正常に完了すれば成功です!
参考
