代码之家  ›  专栏  ›  技术社区  ›  MakotoE

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

  •  0
  • MakotoE  · 技术社区  · 6 年前

    我正在试着做e2e测试。为此,我需要一个本地测试数据库,最好是在Docker中,以便测试设置简单。以下是我目前拥有的一个最基本的项目: https://gitlab.com/MakotoE/mysql-test npm test

    在里面 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 ),我得到这个错误: ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 . 如果我在命令提示符下使用相同的 docker run 代码中使用的命令,我可以成功连接,所以这个问题可能与 ChildProcess.execSync ,但我不知道怎么才能解决这个问题。

    编辑:我不确定这是否相关,但在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
    

    这个实验告诉我两件事: 不是此问题的根本原因,并且此系统(无论是Docker还是到Docker的TCP连接)存在阻止脚本化命令的因素。

    1 回复  |  直到 6 年前
        1
  •  1
  •   MakotoE    6 年前

    最后

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

    之前,我的印象是,我只需要等待约1秒后 docker run ,但实际上初始化数据库大约需要14秒。修复方法就像使用 setTimeout 在连接到数据库之前等待15-20秒。我在branch中举了一个例子 fixed! .