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 感谢您的意见,不幸的是我已经厌倦了两个都没有成功。另外,在执行execrun 时,我希望命令在容器内执行,而不是在主机内执行。 很奇怪。对于主机,我的意思是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 我的命令时,我遇到了竞争条件。一个有效的“解决方案”是sleepexec 之前。我遇到的问题是我不能期望mysqld 的开始时间在所有机器上都相同。一个可接受的解决方案是在运行命令之前传递多个命令以启动mysqld,但这似乎根本不起作用。嗯…… 【参考方案1】:

原来docker-compose rundocker-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 的不同结果

docker run 与 docker-compose 的对应关系

运行docker-compose run时始终包含参数

Docker-Compose Up 有效,但 Eb Local Run 无效