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?
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