Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker compose运行mysql:ERROR 2002(HY000):Can';t通过套接字连接到本地MySQL服务器'/var/run/mysqld/mysqld.sock';(2)_Mysql_Docker_Docker Compose_Mysql5 - Fatal编程技术网

docker compose运行mysql:ERROR 2002(HY000):Can';t通过套接字连接到本地MySQL服务器'/var/run/mysqld/mysqld.sock';(2)

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

连续工作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 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
before
exec
。我的问题是,我不能期望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"