2

I am working with Spring, Postgres and docker-compose. I want to use secrets for the database user and password but it does not work:

version: '3.5'

services:
  web:
    build:
      context: hello-todos-server
    container_name: hello-todos-server
    secrets:
      - db-password
      - db-user
    depends_on:
      - hello-todo-db
    environment:
      SPRING_DATASOURCE_USERNAME_FILE: /run/secrets/db-user
      SPRING_DATASOURCE_PASSWORD_FILE: /run/secrets/db-password

    networks:
      - traefik
      - hello-todos
    labels:
      - 'traefik...'
      - 'traefik...`)'
      - 'traefik...'
      - 'traefik...'

  hello-todo-db:
    image: postgres:14.1-alpine3.15
    restart: always
    container_name: hello-todo-db
    environment:
      POSTGRES_USER_FILE: /run/secrets/db-user
      POSTGRES_PASSWORD_FILE: /run/secrets/db-password
      POSTGRES_DB: hello-todos
    secrets:
      - db-password
      - db-user
    networks:
      - hello-todos
secrets:
  db-password:
    file: secrets/secret-db-password.txt
  db-user:
    file: secrets/secret-db-user.txt

networks:
  traefik:
    external: true
  hello-todos:
    external: false

The error:

Caused by: org.postgresql.util.PSQLException: FATAL: password authentication failed for user "postgres"

...

When I connect to the database via

environment:
      SPRING_DATASOURCE_USERNAME: the-plain-username-stored-in-the-secret
      SPRING_DATASOURCE_PASSWORD: the-plain-password-stored-in-the-secret

it does work. But I would like to do it like

environment:
      SPRING_DATASOURCE_USERNAME_FILE: /run/secrets/db-user
      SPRING_DATASOURCE_PASSWORD_FILE: /run/secrets/db-password

Is this possible? Or is there a better solution, maybe via the application.yml?

I start my services with docker-compose up.

My application.yml:

spring:
  datasource:
    url: jdbc:postgresql://hello-todo-db:5432/hello-todos
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        format_sql: true
    show-sql: true
    database-platform: org.hibernate.dialect.PostgreSQLDialect
Niklas
  • 105
  • 8
  • 1
    I think this is related to your question - https://stackoverflow.com/questions/52492359/docker-secrets-passing-as-environment-variable. Basically ... you cannot get a secret into an environment variable. – JohnXF Dec 15 '21 at 14:25
  • Thanks for the comment. But how can I connect to the database in Spring? – Niklas Dec 15 '21 at 14:53

0 Answers0