docker和mysql:阅读通信数据包时出错

2ledvvac  于 5个月前  发布在  Mysql
关注(0)|答案(4)|浏览(90)

我在docker中的连接有问题。我使用官方mysql 5.7镜像和Prisma服务器。当我通过prisma启动它时,下面使用docker compose(在这里描述)一切正常。
但是我需要通过docker API以编程方式启动这个容器,在这种情况下,来自app的连接会被[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"
    }
  ]
}});

字符串
1.创建mysql容器并将其附加到网络

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();


1.然后我等待MySQL Boot ,从prismagraphql/prisma:1.1创建所需的数据库和Prisma容器并启动它们。应用程序服务器正确解析MySQL主机,但连接被MySQL丢弃。
从app容器到mysql容器在3306端口的连接正确响应:

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


我做错了什么?

m1m5dgzv

m1m5dgzv1#

检查以下内容:

  • 允许的最大数据包数
  • 等待超时
  • 网络读取超时

在问题发生期间还监视MySQL进程列表以确定超时。

7z5jn7bk

7z5jn7bk2#

你可以尝试一些等待,这可能是应用程序尝试连接到mysql服务器之前,它准备接受连接。要测试这一点,添加一些等待启动或运行mysql后,应用程序作为不同的部署。

jutyujz0

jutyujz03#

修复方法是在MySQL参数中添加--wait-timeout=28800(或更高的数字):

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
但也许更明智的做法是找出空闲连接的根本原因。

q9yhzks0

q9yhzks04#

我在Mac Apple Silicon上遇到了同样的问题。同样的问题出现在M1 M2 M3 ARM芯片上。只需在Docker配置中禁用“在Apple Silicon上使用Rosetta进行x86/amd 64仿真”,它就可以正常工作。

相关问题