Невозможно получить доступ к URL внутри контейнера Docker через приложение узла, но работает curl для того же URL - PullRequest
0 голосов
/ 29 октября 2018

Я работаю на микросервисе, который пытается получить доступ к URL. Заголовки для авторизации и Content-type установлены. NPM работает нормально.

Использование curl для доступа к тому же URL с заголовком авторизации также дает результат. Но я получаю эту ошибку при обращении к URL через полный код.

"message":"3. Error while making request - Error: tunneling socket could not be established, cause=connect EINVAL 0.0.12.56:80 - Local (0.0.0.0:0)","level":"error"}

В коде используется модуль запроса-обещания

const request = require('request-promise-native')
const logger = require(process.env.APP_SERVICES_DIR + 'logger');

function getRequestAPI(task) {

  console.log(`Basic ${Buffer.from(
    `${process.env.USERNAME}:${process.env.PASSWORD}`
  ).toString('base64')}`);

  return {
    url: getQueryForTask(task),
    headers: {
      Authorization: `Basic ${Buffer.from(
        `${process.env.USERNAME}:${process.env.PASSWORD}`
      ).toString('base64')}`,
      'Content-Type': 'application/json'
    },
    resolveWithFullResponse: true
  };
}


function makePortalRequest(task) {
  logger.info(`Making request for task ${task.task_key}`);

  return request(getRequestAPI(task))
    .then(response => {
      // logger.info('Response received');
      console.log("get request API" );
      try {
        const responseBody = JSON.parse(response.body);

        // Parse result and store
        return parseResultAndStore(responseBody, task).then(() => {
          return {
            success: true
          };
        });
      } catch (e) {
        logger.error(
          `Fetch Task: Error in parsing response from portal - ${e.message}`,
          e
        );
        return {
          success: false,
          message: e.message
        };
      }
    })
    .catch(e => {
      let errResponse = e.response || e.message;

      if (errResponse.body) {
        let responseBody = '';
        // wrap JSON parse in try catch
        try {
          responseBody = JSON.parse(errResponse.body);
          errResponse = `${
            errResponse.statusMessage
          } : ${responseBody.errorMessages.toString()}`;
          logger.error(`1. Error while making request - ${errResponse}`);
        } catch (e) {
          // if JSON parse fails log the string
          logger.error(
            `2. Error while making request - ${errResponse.body}`
          );
          errResponse = errResponse.body;
        }
      } else {
        logger.error(`3. Error while making request - ${errResponse}`);
      }

      return {
        success: false,
        message: errResponse
      };
    });
}

Эта служба работает в док-контейнере. Компоненты службы описываются файлом docker-compose, и все переменные среды устанавливаются соответствующим образом. Запустив команду ниже, я могу открыть bash внутри Docker-контейнера.

docker-compose exec run service-name bash

Команда curl может получить доступ к URL-адресу из окна докера.

curl -X GET 'https://url-to-fetch/?params=xyz' -H 'Authorization: Basic aDEwMjZzNzpXaXB0ZWxAMjAxOF8='

Но в работающем коде я не могу получить ответ от URL.

"message":"3. Error while making request - Error: tunneling socket could not be established, cause=connect EINVAL 0.0.12.56:80 - Local (0.0.0.0:0)","level":"error"}

Как решить эту проблему? Каковы могут быть возможные причины этой ошибки?

...