首页 > 解决方案 > 问题配置 Docker + Laravel + Mariadb 以避免:SQLSTATE[HY000] [2002] Invalid argument

问题描述

我正在配置我的 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`)'

并从码头日志:

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

谢谢大家,我真的很感激。

标签: phpmysqllaraveldockermariadb

解决方案


可能是您的 .env 文件中的主机错误?您是否尝试过通过 table plus 或类似的客户端连接到数据库?


推荐阅读