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

时间:2018-12-04 23:25:06

标签: 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连接到它,但是失败了,并以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连接)都可以阻止脚本命令

1 个答案:

答案 0 :(得分:0)

最终弄清楚了。我需要做的就是在连接之前等待15秒钟。

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

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