docker-compose run mysql: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/v
Posted
技术标签:
【中文标题】docker-compose run mysql: ERROR 2002 (HY000): Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (2)【英文标题】:docker-compose run mysql: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)docker-compose run mysql: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 【发布时间】:2021-08-15 02:55:18 【问题描述】:连续工作 14 小时后,我完全被烤焦了,即使爬了整个互联网,我也无法解决这个问题。
场景很简单:
我有一个docker-compose.yml
,其中包含安装和部署应用程序所需的许多服务,其中包括一个简单的 MySQL 5 服务:
(...)
mysql:
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
MYSQL_ROOT_PASSWORD:
image: mysql:5
restart: always
volumes:
- .mysql:/var/lib/mysql
(...)
现在我只想在部署应用程序之前创建初始数据库,简单:
docker-compose run mysql mysql -e "CREATE DATABASE IF NOT EXISTS database"
但无论我尝试什么,我都会收到此错误:
Creating network "app_default" with the default driver
Creating app_mysql_run ... done
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
我也试过(没有成功/有同样的错误信息):
docker-compose up -d mysql
docker-compose exec mysql mysql -e "CREATE DATABASE IF NOT EXISTS database"
唯一可行的是进入容器并手动执行exact(!) same(!)命令。但我绝对需要自动化它。
我错过了什么?非常感谢任何形式的帮助!
【问题讨论】:
你能用docker-compose exec mysql mysql -e "CREATE DATABASE IF NOT EXISTS testdb"
运行吗?如果使用run
,则需要在命令中指定主机,因为run
将创建另一个容器与另一个容器通信。
如果你使用run
,命令将类似于docker-compose run mysql mysql -e "CREATE DATABASE IF NOT EXISTS testdb" -h 172.26.0.2
,其中172.26.0.2
应该替换为你的mysql容器ip
@MicFung 感谢您的意见,不幸的是我已经厌倦了两个都没有成功。另外,在执行exec
或run
时,我希望命令在容器内执行,而不是在主机内执行。
很奇怪。对于主机,我的意思是mysql主机,实际上是IP。 run 或 exec 将在容器内运行命令。由于运行命令会创建另一个容器,因此无法直接连接mysql,因此需要指定IP。据我所知,你可以在 bash 模式下运行命令,所以你可以试试docker-compose exec mysql /bin/bash -c "mysql -e \"CREATE DATABASE IF NOT EXISTS abc\""
我想通了,但我对我的“解决方案”并不满意。似乎run
覆盖了入口点,所以mysqld
不存在。使用exec
,当我up
主机容器然后exec
我的命令时,我遇到了竞争条件。一个有效的“解决方案”是sleep
在exec
之前。我遇到的问题是我不能期望mysqld
的开始时间在所有机器上都相同。一个可接受的解决方案是在运行命令之前传递多个命令以启动mysqld
,但这似乎根本不起作用。嗯……
【参考方案1】:
原来docker-compose run
和docker-compose exec
覆盖了Dockerfile 的命令,因此mysqld
永远不会启动。传递mysqld && mysql -e "CREATE DATABASE database"
不起作用,在docker-compose up
之后运行docker-compose exec
将导致竞争条件。
我最终得到了满足我需要的以下解决方案:
docker-compose run mysql && \
docker-compose exec mysql /bin/bash -c "while ! mysql -e \"CREATE DATABASE IF NOT EXISTS database\" &> /dev/null; do sleep 1; done"
这将在子容器上循环命令,直到主机容器准备好。另外,IF NOT EXISTS
在这里很重要,否则如果数据库已经存在,它可能会陷入死锁。
【讨论】:
以上是关于docker-compose run mysql: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/v的主要内容,如果未能解决你的问题,请参考以下文章
Google Cloud Run 中的 docker-compose.yml
使用docker-compose简化docker run 运行参数
使用 docker-compose 与 docker run 的不同结果