thmspl
thmspl

Reputation: 2495

Keycloak docker container throws `java.net.UnknownHostException` during startup

I'm trying to setup a keycloak container on my docker host. Unfortunately the keycloak container can't connect to my db container and always throws a java.net.UnknownHostException.

My docker-compose file:

version: '2' 

services:
  keycloak:
      image: quay.io/keycloak/keycloak:latest
      container_name: keycloak
      restart: always
      networks:
        - webgateway
        - keycloak-net
      environment:
        - DB_VENDOR=MYSQL
        - DB_ADDR=keycloak-db
        - DB_DATABASE=keycloak
        - DB_USER=keycloak
        - DB_PASSWORD=password
        - KEYCLOAK_USER=admin
        - KEYCLOAK_PASSWORD=password
      depends_on:
        - keycloak-db

  keycloak-db:
      image: mysql:5.7
      container_name: keycloak-db
      restart: always
      volumes:
        - /var/keycloak/database:/var/lib/mysql
      networks:
        - keycloak-net
      environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=keycloak
        - MYSQL_USER=keycloak
        - MYSQL_PASSWORD=password

networks:
  keycloak-net:
  webgateway:
    external:
      name: docker_webgateway

The error message:

Caused by: java.net.UnknownHostException: keycloak-db: Name or service not known,
    at java.base/java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method),
    at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929),
    at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1515),
    at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:848),
    at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1505),
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1364),
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1298),
    at [email protected]//com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:132),
    at [email protected]//com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65),
    ... 64 more,
,
23:44:04,490 FATAL [org.keycloak.services] (ServerService Thread Pool -- 72) java.lang.RuntimeException: Failed to connect to database,

Does someone know what I'm doing wrong?

P.S. The docker host is running locally so don't worry about my weak passwords.

Upvotes: 1

Views: 3659

Answers (1)

nischay goyal
nischay goyal

Reputation: 3480

Flag depends_on only ensures the order in which container is started but not whether the container is ready to serve the requests or not and that's what is happening here, where SQL container is started but it's not ready to receive the requests as it takes time. Please follow the below commands and the file, in which I added the health checks as well in docker-compose and you need to change the version to 2.1 or higher.

Create an external docker network

docker network create docker_webgateway

docker-compose.yaml

      container_name: keycloak
      restart: always
      networks:
        - webgateway
        - keycloak-net
      environment:
        - DB_VENDOR=MYSQL
        - DB_ADDR=keycloak-db
        - DB_DATABASE=keycloak
        - DB_USER=keycloak
        - DB_PASSWORD=password
        - KEYCLOAK_USER=admin
        - KEYCLOAK_PASSWORD=password
      depends_on:
        - keycloak-db
  keycloak-db:
      image: mysql:5.7
      container_name: keycloak-db
      restart: always
      healthcheck:
          test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
          timeout: 20s
          retries: 10
      volumes:
        - /var/keycloak/database:/var/lib/mysql
      networks:
        - keycloak-net
      environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=keycloak
        - MYSQL_USER=keycloak
        - MYSQL_PASSWORD=password
networks:
  keycloak-net:
  webgateway:
    external:
      name: docker_webgateway

Create the stack by running the below command

docker-compose up

Upvotes: 3

Related Questions