【问题标题】:How do you set up MySQL in Docker and connect to it?你如何在 Docker 中设置 MySQL 并连接到它?
【发布时间】:2019-05-06 11:14:45
【问题描述】:

我正在尝试设置 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 连接到它,但使用Error: connect ETIMEDOUT 连接失败。

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

如果我尝试通过命令提示符 (mysql -uroot) 连接到在 JavaScript 代码中创建的数据库,我会收到此错误:ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 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 连接)有一些东西阻止了脚本命令。

【问题讨论】:

  • 能否确认mysql服务正在容器内运行?
  • @ValerianPereira 我刚刚解决了这个问题。不过还是谢谢。

标签: mysql node.js docker


【解决方案1】:

终于想通了。我需要做的就是在连接前等待 15 秒。

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

以前,我的印象是在docker run 之后我只需要等待~1 秒,但实际上数据库初始化需要~14 秒。修复就像使用setTimeout 在连接到数据库之前等待15-20 秒一样简单。我在分支fixed!中给出了一个例子。

【讨论】:

  • ZOMG!在过去的 6 个小时里,我只是在等待 Docker 映像在内部设置 MySQL 是一个简单的问题时,才弄清楚如何做到这一点。
猜你喜欢
  • 2021-08-27
  • 2010-09-21
  • 2014-09-11
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
相关资源
最近更新 更多