【发布时间】: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,但这似乎根本不起作用。嗯……
标签: mysql docker docker-compose mysql5