Answer a question

I'm running a NodeJS app and its related services (Redis, Postgres) through docker-compose. My NodeJS app can reach Redis just fine using its name & port from my docker-compose file, but for some reason I can't seem to reach Postgres:

  Error: getaddrinfo EAI_AGAIN postgres
      at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26)

My docker-compose file:

services:
    api:
        build:
            context: ./
            dockerfile: Dockerfile
        ports:
            - "3001:3001"
        depends_on:
            - postgres
            - redis

    postgres:
        image: postgres:11.1
        ports:
            - "5432:5432"
        expose:
            - "5432"
        hostname: postgres
        environment:
            POSTGRES_USER: root
            POSTGRES_PASSWORD: root
            POSTGRES_DB: test
        restart: on-failure
        networks:
            - integration-tests
    redis:
        image: 'docker.io/bitnami/redis:6.0-debian-10'
        environment:
            # ALLOW_EMPTY_PASSWORD is recommended only for development.
            - ALLOW_EMPTY_PASSWORD=yes
            - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
        ports:
            - '6379:6379'
        hostname: redis
        volumes:
            - 'redis_data:/bitnami/redis/data'

I've tried both normal lts and lts-alpine base images for my NodeJS app. I'm using knex, which delegates connecting to the pg library... Anybody have any idea why it won't even connect? I've tried both running directly through docker-compose and through tilt.

Answers

By adding :

        networks:
            - integration-tests

Only for postgres, you create a separate network only for postgres. By default, docker-compose create a network for all your container inside the same file with the name: <project-name>_default. It's why, when using docker-compose all the containers in the same file could communicate using their name.

By specifying a network for postgres, you "ask" to docker-compose to not use the default network for it.

You have 2 solutions: - Remove the instruction to failback to the default network - Add the networks instruction to all other containers in your project / or only those who need it

Note: By default, docker-compose will prefixe all your object (container, networks, volume) with the project name. The default project name is the name of the current directory.

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐