こんにちは。
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が正常に完了すれば成功です!