mysql - 如何在 Docker 中设置 MySQL 并连接到它?

标签 mysql node.js docker

我正在尝试设置 e2e 测试。为此,我需要一个本地测试数据库,最好在 Docker 中,以便测试设置很简单。这是一个最小的项目,显示了我目前拥有的内容:https://gitlab.com/MakotoE/mysql-test如果此问题得到解决,npm test 将以退出代码 0 结束。这是在 Windows 10 上运行的。

main.js 中,我启动了 Docker 镜像 mysql:8.0 的一个实例,如下所示:

const command = 'docker run -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306 -d mysql:8.0';
ChildProcess.execSync(command);

我想使用mysql2连接到它,但失败并显示错误:连接ETIMEDOUT

await mysql.createConnection({
    host: 'localhost',
    user: 'root',
});

如果我尝试通过命令提示符 (mysql -uroot) 连接到在 JavaScript 代码中创建的数据库,则会收到以下错误:ERROR 2013 (HY000): Lost connection to MySQL 服务器正在“读取初始通信数据包”,系统错误:0。如果我使用代码中使用的相同 docker run 命令在命令提示符下创建容器,则可以成功连接,因此此问题可能与 ChildProcess.execSync 有关,但是我不知道如何解决这个问题。

如何修复我的代码,以便可以在 Docker 中启动 MySQL 服务器并在 Windows 10 上运行的 Node.js 中连接到它?

编辑:我不确定这是否相关,但在 Debian 上运行它会在创建容器时显示此错误消息:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:
Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/57f5b631e551466e1f9928ba62f7a5e2a5ad2a481da4686bda8684f1a71b8d7/stop: dial unix /var/run/docker.sock: connect: permission denied

连接失败,并显示 ETIMEDOUT

编辑:我添加了分支 secondAttempt ,在该分支中我尝试通过 NPM 脚本运行 .js 文件之外的所有命令,但没有成功。运行此分支的测试后,您必须手动停止 Docker 容器。

mysql -uroot 命令中,它失败并显示:

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

我认为这与之前遇到的错误相同,但消息不同(由于客户端不同)。

这个实验告诉我两件事:ChildProcess.execSync 不是这个问题的根本原因,而且这个系统有一些问题(无论是 Docker,还是到 Docker 的 TCP 连接) )阻止脚本命令。

最佳答案

终于明白了这一点。我所需要做的就是在连接前等待 15 秒。

我犯的错误是一个常见的错误:没有阅读自述文件。在 mysql Docker Hub page ,在“MySQL init 完成之前没有连接”部分中,它提到了必须如何等待数据库初始化完成。示例存储库通过循环重试连接来实现此目的,但我认为延迟一段设定的时间更简单。

之前,我的印象是docker run后只需要等待约1秒,但实际上数据库初始化需要约14秒。修复方法非常简单,只需使用 setTimeout 在连接到数据库之前等待 15-20 秒即可。我在分支 fixed! 中给出了一个示例。

关于mysql - 如何在 Docker 中设置 MySQL 并连接到它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53622917/

相关文章:

docker - 从 Golang-Web 服务器控制 Docker

docker - 已安装PHP,Composer和Docker的Docker镜像

mysql - 是否可以对表的某一列中的所有值进行无限制?

java - 我有驱动程序,class.forname() 不会抛出异常,但会抛出 'No Suitable Driver for MySQL '

php - 全日历 PHP mysql JSON

javascript - 将只有键的对象分配给 require 语句

javascript - ExpressJS 上的异步函数

php - MAX_JOIN_SIZE 行; SET SQL_BIG_SELECTS=1 - 脚本在 2 年后停止工作

node.js - 如何通过 webhook 在dialogflow上回复来自Web演示的消息

docker - Chronos 不运行作业