Docker和MySQL:读取通信数据包时出错

24

我在docker中遇到了连接问题。我使用官方的mysql 5.7镜像和Prisma服务器。当我通过使用prisma cli启动它时,它会在其下方使用docker compose(在此处描述:这里),一切都正常。

但是我需要通过docker api以编程方式启动这些容器,在这种情况下,应用程序连接会因为[Note] Aborted connection 8 to db: 'unconnected' user: 'root' host: '164.20.10.2' (Got an error reading communication packets)而断开。

所以我做了什么:

  1. 创建一个桥接网络:

    const network = await docker.network.create({
    Name: manifest.name + '_network',
    IPAM: {
      "Driver": "default",
      "Config": [
        {
          "Subnet": "164.20.0.0/16",
          "IPRange": "164.20.10.0/24"
        }
      ]
    }});
    
  2. 创建mysql容器并将其附加到网络

  3. const mysql = await docker.container.create({
    Image: 'mysql:5.7',
    Hostname: manifest.name + '-mysql',
    Names: ['/' + manifest.name + '-mysql'],
    NetworkingConfig: {
      EndpointsConfig: {
        [manifest.name + '_network']: {
          Aliases: [manifest.name + '-mysql']
        }
      }
    },
    Restart: 'always',
    Args: [
      "mysqld",
      "--max-connections=1000",
      "--sql-mode=ALLOW_INVALID_DATES,ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO,HIGH_NOT_PRECEDENCE,IGNORE_SPACE,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_UNSIGNED_SUBTRACTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY,PIPES_AS_CONCAT,REAL_AS_FLOAT,STRICT_ALL_TABLES,STRICT_TRANS_TABLES,ANSI,DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,TRADITIONAL"
    ],
    Env: [
      'MYSQL_ROOT_PASSWORD=secret'
    ]
    });
    
    await network.connect({
       Container: mysql.id
    });
    await mysql.start();
    
  4. 然后我等待Mysql启动,创建所需的数据库和所需的Prisma容器,这些容器来自prismagraphql/prisma:1.1,并启动它们。应用程序服务器正确解析mysql主机,但是mysql会断开连接。

从应用程序容器到mysql容器的3306端口进行telnet响应正确:

J
5.7.21U;uH  Kem']#45T]2mysql_native_password

我做错了什么?


你尝试过增加 max_allowed_packet 吗? - Mostafa Hussein
3个回答

1

请查看以下内容:

  • max_allowed_packets
  • wait_timeout
  • net_read_timeout

同时,在问题发生时监控MySQL进程列表以识别超时。


0

你可以尝试等待一下,可能是应用程序在准备好接受连接之前尝试连接到MySQL服务器。为了测试这个问题,在启动时添加一些等待时间或者将MySQL和应用程序作为不同的部署来运行。


0
解决方法是将--wait-timeout=28800(或更高的数字)添加到MySQL参数中:
Args: [
  "mysqld",
  "--max-connections=1000",
  "--sql-mode=ALLOW_INVALID_DATES,ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO,HIGH_NOT_PRECEDENCE,IGNORE_SPACE,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_UNSIGNED_SUBTRACTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY,PIPES_AS_CONCAT,REAL_AS_FLOAT,STRICT_ALL_TABLES,STRICT_TRANS_TABLES,ANSI,DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,TRADITIONAL",
  "--wait-timeout=28800" // 28800 sec = 8 hours
],

参考:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_wait_timeout

但也许更明智的做法是找出空闲连接的根本原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接