skip to Main Content

I just started using docker-compose and I am enjoying it.

I recently just created my first docker-compose file that simply connects sonarqube and postgres. Inside my docker-compose.yml file, whenever I define the database service with any other name besides "db", my docker-compose does not run successfully.

This is the error:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdk.internal.loader.ClassLoaders$AppClassLoader@277050dc-org.sonar.db.DefaultDatabase': Initialization of bean failed; nested exception is java.lang.IllegalStateException: Fail to connect to database

This is the code in my docker compose file:

version: "3"

services:

sonarqube:
    image: sonarqube
    expose:
      - 9000

    ports:
      - "127.0.0.1:9000:9000"

    networks:
      - sonarnet

    environment:
      - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
      - sonar.jdbc.username=sonar
      - sonar.jdbc.password=sonar

    volumes:
      - sonarqube_conf:/opt/sonarqube/conf
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins

db:
    image: postgres
    networks:
      - sonarnet
    ports:
      - "5432:5432"

    environment:
      - POSTGRES_USER=sonar
      - POSTGRES_PASSWORD=sonar

    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

networks:
  sonarnet:

volumes:
  sonarqube_conf:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_bundled-plugins:
  postgresql:
  postgresql_data:

Is there anything special about the name "db"? Are there any conventions/rules for defining services in docker-compose?

Thank you.

2

Answers


  1. Update your docker-compose with depends_on property to let docker know that db should be created firstly:

    version: "3"
    
    services:
    
    sonarqube:
      image: sonarqube
      expose:
        - 9000
    
      ports:
        - "127.0.0.1:9000:9000"
    
      networks:
        - sonarnet
    
      environment:
        - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
        - sonar.jdbc.username=sonar
        - sonar.jdbc.password=sonar
    
      volumes:
        - sonarqube_conf:/opt/sonarqube/conf
        - sonarqube_data:/opt/sonarqube/data
        - sonarqube_extensions:/opt/sonarqube/extensions
        - sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins
      depends_on:
        - db
    
    db:
      image: postgres
      networks:
        - sonarnet
      ports:
        - "5432:5432"
    
      environment:
        - POSTGRES_USER=sonar
        - POSTGRES_PASSWORD=sonar
    
      volumes:
        - postgresql:/var/lib/postgresql
        - postgresql_data:/var/lib/postgresql/data
    
    networks:
      sonarnet:
    
    
    volumes:
      sonarqube_conf:
      sonarqube_data:
      sonarqube_extensions:
      sonarqube_bundled-plugins:
      postgresql:
      postgresql_data:
    
    Login or Signup to reply.
  2. You have to change the service name also within the sonarqube’s connections string.

    here, replace the string db with how you renamed the service for postgres (these have to match):

        environment:
          - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar
    #                                         ^ here
    

    It is needed, because docker-compose registers hostnames (defined by service names) for the stack so they are always dynamically accessible.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search