问题配置 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 包