docker compose运行mysql:ERROR 2002(HY000):Can';t通过套接字连接到本地MySQL服务器'/var/run/mysqld/mysqld.sock';(2)
连续工作14个小时后,我完全被烤坏了,即使爬遍了整个互联网,我也无法解决这个问题 场景可以想象得很简单: 我有一个docker compose运行mysql:ERROR 2002(HY000):Can';t通过套接字连接到本地MySQL服务器'/var/run/mysqld/mysqld.sock';(2),mysql,docker,docker-compose,mysql5,Mysql,Docker,Docker Compose,Mysql5,连续工作14个小时后,我完全被烤坏了,即使爬遍了整个互联网,我也无法解决这个问题 场景可以想象得很简单: 我有一个docker compose.yml,安装和部署应用程序需要很多服务,其中包括一个简单的MySQL 5服务: (...) mysql: environment: MYSQL_ALLOW_EMPTY_PASSWORD: "yes" MYSQL_ROOT_PASSWORD: image: mysql:5 res
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 run
和docker compose exec
覆盖Dockerfile的命令,因此mysqld
永远不会启动。传递mysqld&&mysql-e“创建数据库”
无效,在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"
这将在子容器上循环该命令,直到主机容器准备就绪。另外,
如果不存在
在这里很重要,否则如果数据库已经存在,它可能会陷入死锁。您是否能够使用docker compose exec mysql mysql-e“创建数据库如果不存在testdb”
?如果使用run
,则需要在命令中指定主机,因为run
将创建另一个容器以与另一个容器通信。如果使用run
,则命令类似于docker compose run mysql mysql-e“如果不存在,则创建数据库testdb”-h 172.26.0.2
其中应使用mysql容器替换172.26.0.2
ip@MicFung谢谢你的投入,不幸的是我已经累了,但都没有成功。另外,当执行exec
或run
时,我希望命令在容器中执行,而不是在主机中执行。对于主机,我指的是mysql主机,实际上是指IP。run或exec将在容器内运行该命令。由于run命令将创建另一个容器,mysql无法直接连接,因此需要指定IP。据我所见,您可以在bash模式下运行该命令,因此您可以尝试docker compose exec mysql/bin/bash-c“mysql-e\”创建数据库(如果不存在abc\”
我找到了答案,但我对我的“解决方案”不满意。似乎run
覆盖了入口点,因此mysqld
不存在。使用exec
,当我up
主机容器,然后exec
我的命令时,我会遇到竞争条件。一个有效的“解决方案”是sleep
beforeexec
。我的问题是,我不能期望mysqld的开始时间在所有机器上都是一样的。一个可接受的解决方案是在运行命令之前传递多个命令来启动mysqld
,但这似乎根本不起作用。无聊的。。。
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"