docker и mysql: ошибка при чтении пакетов связи

У меня проблема с подключением в докере. Я использую официальный образ 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 и подключение его к сети

    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();
    
  3. Затем я жду загрузки Mysql, создаю необходимые базы данных и необходимые Prisma контейнеры из prismagraphql/prisma:1.1 и запускаю их. Сервер приложений корректно разрешает хост mysql, но соединения сбрасываются mysql.

Telnet из контейнера приложения в контейнер mysql в порту 3306 отвечает правильно:

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

Что я делаю не так?


person Terion    schedule 23.02.2018    source источник
comment
Вы пытались увеличить max_allowed_packet ?   -  person Mostafa Hussein    schedule 09.03.2019


Ответы (3)


Проверьте следующее:

  • max_allowed_packets
  • ожидание_тайм-аут
  • net_read_timeout

Также отслеживайте список процессов MySQL во время проблемы, чтобы определить тайм-ауты.

person Vaibhav    schedule 15.07.2020

Можете ли вы попробовать немного подождать, возможно, приложение попытается подключиться к серверу mysql, прежде чем оно будет готово принять соединение. Чтобы проверить это, добавьте немного ожидания при запуске или запустите mysql, а затем приложение в качестве разных развертываний.

person Akash Sharma    schedule 12.04.2019

Исправление состоит в том, чтобы добавить --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

Но, может быть, разумнее выяснить, что является основной причиной простаивающих соединений.

person iqqmuT    schedule 08.09.2020