postgresqldockersonarqube

Sonarqube and Postgres running on Docker throws ‘Create initial schema’ failed and ERROR: relation "active_rule_parameters" already exists Issue


I tried to implement an example of Spring Boot with Postgres through Docker. After running the command named docker-compose up -d --build, they are all greeen. However, I got the errors in the console when I looked through postgres and sonarqube.

Sonarqube throws

2025-03-13 19:03:37 Caused by: java.lang.IllegalStateException: Fail to execute CREATE TABLE active_rule_parameters (uuid VARCHAR (40) NOT NULL,value VARCHAR (4000) NULL,rules_parameter_key VARCHAR (128) NULL,active_rule_uuid VARCHAR (40) NOT NULL,rules_parameter_uuid VARCHAR (40) NOT NULL, CONSTRAINT pk_active_rule_parameters PRIMARY KEY (uuid))
Caused by: org.postgresql.util.PSQLException: ERROR: relation "active_rule_parameters" already exists

Postgres throws

2025-03-13 19:02:48 2025-03-13 16:02:48.584 UTC [494] ERROR:  relation "active_rule_parameters" already exists
2025-03-13 19:02:48 2025-03-13 16:02:48.584 UTC [494] STATEMENT:  CREATE TABLE active_rule_parameters (uuid VARCHAR (40) NOT NULL,value VARCHAR (4000) NULL,rules_parameter_key VARCHAR (128) NULL,active_rule_uuid VARCHAR (40) NOT NULL,rules_parameter_uuid VARCHAR (40) NOT NULL, CONSTRAINT pk_active_rule_parameters PRIMARY KEY (uuid))

Here is my docker-compose.yml shown below

services:

  postgres:
    image: postgres:latest
    container_name: postgres-container
    restart: always
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=footballteamdatabase
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - footballteamapi_network

  pgadmin:
    image: dpage/pgadmin4:latest
    container_name: pgadmin-container
    restart: always
    ports:
      - "5050:80"
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@pgadmin.com
      - PGADMIN_DEFAULT_PASSWORD=admin
    depends_on:
      - postgres
    networks:
      - footballteamapi_network

  footballteamapi:
    image: 'footballteamapi:latest'
    build:
      context: .
      dockerfile: Dockerfile
    container_name: footballteamapi
    restart: on-failure
    env_file:
      - .env  # Use the .env file for environment variables
    ports:
      - "3112:3112"
    environment:
      - server.port=3112
      - FOOTBALL_TEAM_DB_IP=postgres
      - FOOTBALL_TEAM_DB_PORT=5432
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - JAVA_OPTS=-Dname=footballteamapi
    depends_on:
      - postgres
      - sonarqube
    networks:
      - footballteamapi_network

  sonarqube:
    image: sonarqube:latest
    container_name: sonarqube
    restart: always
    ports:
      - "9000:9000"
    environment:
      - SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/footballteamdatabase
      - SONAR_JDBC_USERNAME=${POSTGRES_USER}
      - SONAR_JDBC_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    depends_on:
      - postgres
    networks:
      - footballteamapi_network

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./data/prometheus/config:/etc/prometheus/
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    networks:
      - footballteamapi_network

  grafana:
    image: "grafana/grafana-oss:latest"
    pull_policy: always
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - ./data/grafana:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_SERVER_DOMAIN=localhost
    networks:
      - footballteamapi_network

  loki:
    image: grafana/loki:latest
    container_name: loki
    restart: unless-stopped
    ports:
      - "3100:3100"
    volumes:
      - ./data/loki/config/loki-config.yaml:/etc/loki/loki-config.yaml
    networks:
      - footballteamapi_network

volumes:
  postgres_data:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:

networks:
  footballteamapi_network:
    driver: bridge

How can I fix the issue?


Solution

  • I fixed the issue.

    Here is the solution way

    1 ) Prepare the init.sql script to create separate databases and users.

    Create a file called init.sql in the same folder as docker-compose.yml with this content

    CREATE DATABASE footballteamdatabase;
    
    CREATE DATABASE sonarqubedb;
    
    CREATE USER sonar WITH PASSWORD 'sonar';
    
    GRANT ALL PRIVILEGES ON DATABASE sonarqube TO sonar;
    

    2 ) Configure SonarQube properly (using mounted volume)

    SonarQube no longer supports database connection via environment variables

      sonarqube:
        image: sonarqube:latest
        container_name: sonarqube
        restart: always
        ports:
          - "9000:9000"
        volumes:
          - sonarqube_data:/opt/sonarqube/data
          - sonarqube_extensions:/opt/sonarqube/extensions
          - sonarqube_logs:/opt/sonarqube/logs
        depends_on:
          - postgres
        networks:
          - footballteamapi_network
    

    3 ) Modify your existing docker-compose.yml through using a single Postgres instance with two databases

    services:
      postgres:
        image: postgres:latest
        container_name: postgres-container
        restart: always
        ports:
          - "5432:5432"
        environment:
          POSTGRES_USER: ${POSTGRES_USER}
          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
        volumes:
          - postgres_data:/var/lib/postgresql/data
          - ./init.sql:/docker-entrypoint-initdb.d/init.sql
        networks:
          - footballteamapi_network