php - 使用 Docker 和 Laravel 我在 MySQL 中遇到此错误 : “SQLSTATE[HY000] [2002] No such file or directory”

标签 php mysql laravel docker

我在 laravel 5.2 中有一个应用程序,可以连接到 mysql 中的本地数据库,没有任何问题。但是,当我将应用程序放入 docker 容器中时,无法连接到我的数据库,并且收到此错误:

SQLSTATE[HY000] [2002] No such file or directory

如果我将 .env 文件中的 DB_HOST 更改为 127.0.0.1 而不是 localhost,那么我会得到另一个:

SQLSTATE[HY000] [2002] Connection refused

我读到问题可能是 php.ini 中套接字的路径

$ ls -l /var/run/mysqld/mysqld.sock
$ srwxrwxrwx 1 mysql mysql 0 nov 27 08:31 /var/run/mysqld/mysqld.sock

所以,我只在 pdo 的情况下包含:

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/pdo_mysql.default-socket
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

我的 .env 的一部分

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=developer
DB_PASSWORD=123456

我的数据库.php

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],

我使用 docker compose 来挂载容器,因为我打算稍后创建其他微服务:

version: "3.3"
services:
   api_test:
      build: .
      ports:
         - "8181:8181"
      env_file:
         - ./.env
      environment:
         - PORT:8181

我的 Dockerfile:

FROM php:7.1.5-apache

RUN apt-get update -y && apt-get install -y openssl zip unzip git
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install pdo pdo_mysql mbstring
WORKDIR /api_test
COPY . /api_test
RUN composer install
RUN a2enmod rewrite
CMD php artisan serve --host=0.0.0.0 --port=8181
EXPOSE 8181

我使用:

  • Debian 9.6,内核4.9.0-8-amd64

  • Apache/2.4.25

  • PHP 7.0.30-0+deb9u1

  • MariaDB 10.1.37 数据库服务器

有什么想法吗?

最佳答案

如果您位于容器内,则 localhost 或 127.0.0.1 不正确,因为您的容器将在容器内部而不是主机内调用。

您必须使用 ifconfig 命令获取本地 IP,当然是“192.168 ....”,并用此 IP 替换 localhost。

您还可以在容器中创建数据库,这更容易。

关于php - 使用 Docker 和 Laravel 我在 MySQL 中遇到此错误 : “SQLSTATE[HY000] [2002] No such file or directory” ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53559350/

相关文章:

php - 为时间序列数据MySQL创建小时组

PHP 静态方法初始化 $_SESSION 变量?

php - 从数据库获取描述等文本时如何创建边距

php - Wordpress 管理菜单指向主题文件

mysql - 尝试执行 mysqldump 命令时出现错误 1064(42000)

php - 基于列值打印值 - MYSQL、PHP

MySql 声明和选择变量的使用

css - 如何使用 laravel 5.7 更改 fontawesome 的导入路径

laravel - 如何使用 sortBy() 对 Laravel 集合进行升序排序,并将 NULL 值放在最后而不是第一个

php - Array 的 Laravel 验证不起作用