我在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)
而被删除。
所以我做什么:
-
创建网桥网络:
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" } ] }});
-
创建 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();
- 然后我等待Mysql启动,从
prismagraphql/prisma:1.1
创建所需的数据库和所需的Prisma
容器并启动它们。应用服务器正确解析 mysql 主机,但连接被 mysql 丢弃。
从应用程序容器到 3306 端口中的 mysql 容器的 Telnet 响应正确:
J
5.7.21U;uH Kem']#45T]2mysql_native_password
我做错了什么?
检查以下内容:
- max_allowed_packets
- wait_timeout
- net_read_timeout
还要在问题期间监视 MySQL 进程列表以确定超时。
您可以尝试等待一些时间吗,应用程序可能会在准备好接受连接之前尝试连接到mysql服务器。要对此进行测试,请在启动时添加一些等待或运行 mysql,然后添加应用程序作为不同的部署。
解决方法是将--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
但也许找出空闲连接的根本原因是什么更明智。