0

I am trying to have a NodeJS server respond with data from an external API. Consider the index.js file:

const express = require('express');
const axios = require('axios');
const app = express();

app.get('/api', async function (req, res) {

  url = 'http://freegeoip.app/json/';

  // external API request
  var ax = axios.get(url)
    .then(function(data) {
      res.json(data.data)
    })
    .catch(function(err) {
      res.status(404);
    })

})

app.listen(3000);

When I visit http://localhost:3000/api the JSON data from http://freegeoip.app/json/ is presented and loads within 500 ms.

The problem is my NodeJS server in production runs within a Docker container. Running the exact same code in my Docker container takes approximately 5 seconds to load. I suspect this is a DNS resolution issue from the Docker container. Is there a way to show time spent on an external API request with axios? If this is a DNS issue, it seems to only affect NodeJS as I can curl from another Docker container.

For reference below is the Dockerfile and docker-compose.yml:

FROM node:15.14.0-alpine3.13
WORKDIR /backend
RUN npm install express
RUN npm install axios
RUN npm install -g nodemon
COPY . .
CMD ["nodemon", "/backend/index.js"]
version: '3'

services:

  backend:
    restart: always
    build: ./backend
    volumes:
      - ./backend:/backend
      - /backend/node_modules
    ports:
      - "3000:3000"

1 Answers1

0

It was a DNS issue. After stumbling across this Stack Overflow post, the DNS server can be specified in the docker-compose.yml file. The API data now loads just as fast as the browser.

version: '3'

services:

  backend:
    restart: always
    build: ./backend
    volumes:
      - ./backend:/backend
      - /backend/node_modules
    ports:
      - "3000:3000"
    dns:
      - 8.8.8.8