топор ios почтовый разъём вешается только в docker - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть сервер, который занимает более 10 минут, чтобы начать отвечать на запрос. У меня есть клиент nodejs, который использует ax ios для отправки запроса на этот сервер. Я настроил время ожидания ax ios на 30 минут.

Когда код запускается прямо на моей машине, ax ios правильно ожидает ответа, и через 10 минут я получаю 200 OK. Когда тот же сценарий выполняется в docker (узел: базовый образ 10), через 5,5 минут я получаю сообщение об ошибке зависания сокета.

сервер:

const http = require('http')

const server = http.createServer(function (request, response) {
    if (request.method == 'POST') {
        var body = ''
        request.on('data', function (data) { 
            body += data
            console.log('Partial body: ' + body)
        })

        request.on('end', function () {
            setTimeout(() => {
                response.writeHead(200, { 'Content-Type': 'text/html' })
                response.end('post received')
            }, 1000 * 60 * 10);
        });
    } else {
        response.writeHead(200, { 'Content-Type': 'text/plain' });
        response.end('Ok');
    }
})

const port = 5000
const host = '10.0.0.50'
server.setTimeout(1000 * 60 * 30);
server.listen(port, host)
console.log(`Listening at http://${host}:${port}`)

клиент:

let axios = require('axios');

async function run () {
    const axiosInstance = axios.create({
        baseURL: 'http://livedoc.transmissionmedia.ca/',
        timeout: (1000 * 60 * 30),
    });

    axiosInstance.defaults.timeout = (1000 * 60 * 30);

    console.log(`${new Date().toISOString()} - start`);
    // const resp = await axiosInstance.post(`http://10.0.0.50:5000/weatherforecast`);
    const resp = await axiosInstance({
        method: 'post',
        url: `http://10.0.0.50:5000/weatherforecast`,
        timeout: 1000 * 60 * 30
    });
    // const resp = await axiosInstance.post(`http://10.0.0.50:5000/weatherforecast`);
    console.log(`${new Date().toISOString()} - end`);
}

run()
    .then(() => {  console.error('Succeeded!');  process.exit(0); })
    .catch(err => { console.error('Failed!'); console.error(err); process.exit(-1); });

Когда клиентский скрипт запускается в контейнере docker, примерно через 5,5 минут появляется следующая ошибка:

{ Error: socket hang up
    at createHangUpError (_http_client.js:332:15)
    at Socket.socketOnEnd (_http_client.js:435:23)
    at Socket.emit (events.js:203:15)
    at endReadableNT (_stream_readable.js:1145:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)
  code: 'ECONNRESET',
  ...
}
...