【发布时间】: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 我刚刚解决了这个问题。不过还是谢谢。