问题配置 Docker + Laravel + Mariadb 以避免:SQLSTATE[HY000] [2002] Invalid argument

Posted

技术标签:

【中文标题】问题配置 Docker + Laravel + Mariadb 以避免:SQLSTATE[HY000] [2002] Invalid argument【英文标题】:Issue configuring Docker + Laravel + Mariadb to avoid: SQLSTATE[HY000] [2002] Invalid argument 【发布时间】:2021-01-08 22:32:31 【问题描述】:

我正在配置我的 laravel 应用程序以在 docker 容器中运行;我已经在 php7.4-apache docker 镜像之上成功配置了 laravel 端,并且我已经为数据库单独配置了 Mariadb10.3 镜像。我已经解决了一些连接问题,最终归结为以下错误:

SQLSTATE[HY000] [2002] Invalid argument (SQL: select * from information_schema.tables where table_schema = laravel_db and table_name = migrations and table_type = 'BASE TABLE')

运行 php artisan migrate 时会出现上面的特定错误实例,但我在其他两个地方也看到相同的错误:使用 php artisan tinker 并尝试对已验证存在的表进行基本查询时,以及运行时通过我的 laravel 应用程序进行查询(通过访问测试服务器上的站点触发)。错误重现如下:

\DB::table('users')->get();
Illuminate/Database/QueryException with message 'SQLSTATE[HY000] [2002] Invalid argument (SQL: select * from `users`)'

以及来自 docker 日志:

PDOException(code: 2002): SQLSTATE[HY000] [2002] Invalid argument at /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

我通过 SO 找到的有关此特定错误的唯一信息来自以下两个帖子: SO#1 SO#2

两者都表明您需要“指定 TCP/IP (1),或告诉 mysql 您的 Unix 套接字在哪里 (2)”,但是,我正在使用 docker 并通过 docker 容器名称引用我的数据库,如图所示在我的 .env 文件中:

DB_CONNECTION=mysql
DB_HOST=db
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=<MY_PASSWORD>
DB_HOST=3333

所以我的问题是:如何在使用 docker 时绕过此错误?我需要在 .env 文件中引用 docker 容器,以便 docker 方面的工作,所以我无法实施 SO 的建议。我还在 SO 之外进行了广泛搜索(查看 Mariadb 文档以获取错误文档并广泛搜索)但无济于事。

我的 docker-compose 文件在这里,以备不时之需:

version: "2.2"
services:
 app:
  image: php:7.4-apache
  ports:
   - "8060:80"
  tty: true
  restart: unless-stopped
  working_dir: /var/www/html
  container_name: app
  build:
   context: .
   dockerfile: app_dockerfile
  networks:
   - app-network

 db:
  image: mariadb:10.3
  container_name: db
  restart: unless-stopped
  tty: true
  environment:
   MYSQL_ROOT_PASSWORD: <MY_PASSWORD>
   MYSQL_DATABASE: laravel_db
   SERVICE_TAGS: dev
   SERVICE_NAME: mysql
  networks:
   - app-network
  volumes:
   - dbdata:/var/lib/mysql/docker_db/
  build:
   context: .
   dockerfile: db_dockerfile
  ports:
   - "3333:3306"
networks:
 app-network:
  driver: bridge

volumes:
 dbdata:
  driver: local

谢谢大家,真的很感激。

【问题讨论】:

好吧,看起来我上面的 .env 文件配置不正确——我在那里有两次 DB_HOST。将其正确更改为 DB_PORT 后,我现在得到:SQLSTATE[HY000] [2002] Connection refused 【参考方案1】:

会不会是你的 .env 文件中的主机不对?您是否尝试过通过 table plus 或类似的客户端连接到数据库?

【讨论】:

我已通过第二个 mariadb 容器(通过此处的说明:hub.docker.com/_/mariadb)连接到 db,并且已成功从主机容器 ping db 容器。我还验证了两个容器都在同一个 docker 网络上。

以上是关于问题配置 Docker + Laravel + Mariadb 以避免:SQLSTATE[HY000] [2002] Invalid argument的主要内容,如果未能解决你的问题,请参考以下文章

在 docker 环境中使用 laravel websockets 包

docker 部署读写分离及laravel读写分离原理剖析

使用docker lnmp镜像包部署搭建laravel项目

Laravel-echo-server 码头化问题

如何将“Phpmyadmin”添加到 laravel 帆(docker + laravel)-自动:回答

将 Laravel Echo 与 docker 一起使用(CORS 问题)