Docker Compose cannot connect to database

10,811

Take a look at your /etc/hosts inside the backend container. You will see

192.0.18.1    dir_db_1

or something like that. The IP will be different and dir will represent the dir you're in. Therefore, you must change TYPEORM_HOST=localhost to TYPEORM_HOST=dir_db_1.

Although, I suggest you set static names to your containers.

services:
  db:
    container_name: project_db
    ...
  backend:
    container_name: project_backend

In this case you can always be sure, that your container will have a static name and you can set TYPEORM_HOST=project_db and never worry about the name ever again.

Share:
10,811
arahfahrrad
Author by

arahfahrrad

Updated on June 17, 2022

Comments

  • arahfahrrad
    arahfahrrad almost 2 years

    I'm using nestjs for my backend and using typeorm as ORM. I tried to define my database and my application in an docker-compose file.

    If I'm running my database as a container and my application from my local machine it works well. My program connects and creates the tables etc.

    But if I try to connect the database from within my container or to start the container with docker-compose up it fails.

    Always get an ECONNREFUSED Error.

    Where is my mistake ?

    docker-compose.yml

    version: '3.1'
    volumes:
     dbdata:
    
    services:
      db:
        image: postgres:10
        volumes:
          - ./dbData/:/var/lib/postgresql/data
        restart: always
        environment:
          - POSTGRES_PASSWORD=${TYPEORM_PASSWORD}
          - POSTGRES_USER=${TYPEORM_USERNAME}
          - POSTGRES_DB=${TYPEORM_DATABASE}
        ports:
          - ${TYPEORM_PORT}:5432
    
      backend:
        build: .
        ports:
          - "3001:3000"
        command: npm run start
        volumes:
          - .:/src
    

    Dockerfile

    FROM node:10.5
    
    WORKDIR /home
    
    # Bundle app source
    COPY . /home
    
    # Install app dependencies
    #RUN npm install -g nodemon
    # If you are building your code for production
    # RUN npm install --only=production
    RUN npm i -g @nestjs/cli
    RUN npm install
    
    EXPOSE 3000
    

    .env

    # .env
    HOST=localhost
    PORT=3000
    NODE_ENV=development
    LOG_LEVEL=debug
    
    TYPEORM_CONNECTION=postgres
    TYPEORM_HOST=localhost
    TYPEORM_USERNAME=postgres
    TYPEORM_PASSWORD=postgres
    TYPEORM_DATABASE=mariokart
    TYPEORM_PORT=5432
    TYPEORM_SYNCHRONIZE=true
    TYPEORM_DROP_SCHEMA=true
    TYPEORM_LOGGING=all
    TYPEORM_ENTITIES=src/database/entity/*.ts
    TYPEORM_MIGRATIONS=src/database/migrations/**/*.ts
    TYPEORM_SUBSCRIBERS=src/database/subscribers/**/*.ts
    

    I tried to use links but it don't work in the container.