[keycloak-user] Keycloak-mysql Docker -- 2 issues

Jonathan D'Andries jonathandandries at gmail.com
Fri May 12 15:48:21 EDT 2017


Two issues related to running keycloak-mysql:3.0.0.Final and mysql:5.7.18
in docker-compose, but that will likely have broader impact in certain
circumstances:

Issue #1. JBoss doesn't wait for mysql to be available, and it fails to
create a connection if mysql hasn’t come up yet (no retry). This is
especially problematic if you are trying to use docker-compose since
everything likes to start around the same time:

Error:

19:18:03,553 WARN
[org.jboss.jca.core.connectionmanager.pool.strategy.OnePool]
(ServerService Thread Pool -- 50) IJ000604: Throwable while attempting
to get a new connection: null: javax.resource.ResourceException:
IJ031084: Unable to create connection

Workaround:

   - Need a custom Dockerfile to override the ENTRYPOINT definition to use
   a custom docker-entrypoint-waitforit.sh. And note that because we are
   changing ENTRYPOINT, we also need to redefine CMD.

Gist of the Dockerfile:

FROM jboss/keycloak-mysql:3.0.0.Final
COPY  docker-entrypoint-waitforit.sh wait-for-it.sh /
ENTRYPOINT ["/docker-entrypoint-waitforit.sh”]
CMD ["-b", "0.0.0.0"]

Gist of docker-entrypoint-waitforit.sh:

#!/bin/bash
/wait-for-it.sh mysql:3306 -t 60 -- /opt/jboss/docker-entrypoint.sh $@
exit $?

For wait-for-it.sh, see: https://github.com/vishnubob/wait-for-it or see:
https://github.com/jwilder/dockerize

Docker recommends this approach:
https://docs.docker.com/compose/startup-order/

Issue #2. When running in docker-compose, JBoss cannot connect to mysql
without some extra work. This issue seems to be related to running on the
project-specific default network that is setup by docker-compose.

Note that you don’t have this issue when running independent in docker:

docker run --name mysql -e MYSQL_DATABASE=keycloak -e
MYSQL_USER=keycloak -e MYSQL_PASSWORD=password -e
MYSQL_ROOT_PASSWORD=root_password -d mysql:5.7.18
# wait 30 seconds
docker run --name keycloak-standalone-test --link mysql:mysql -e
KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -e
MYSQL_DATABASE=keycloak -e MYSQL_USERNAME=keycloak -e
MYSQL_PASSWORD=password -p "8080:8080"
jboss/keycloak-mysql:3.0.0.Final

Error when running in docker-compose:

19:24:04,072 ERROR [org.jboss.as.controller.management-operation]
(ServerService Thread Pool -- 27) WFLYCTL0013: Operation ("add")
failed - address: ([
    ("subsystem" => "datasources"),
    ("data-source" => "KeycloakDS")
]) - failure description: "WFLYCTL0211: Cannot resolve expression
'jdbc:mysql://${env.MYSQL_PORT_3306_TCP_ADDR}:${env.MYSQL_PORT_3306_TCP_PORT}/${env.MYSQL_DATABASE:keycloak}'”

Workarounds:

   1.

   Option-1: In docker-compose.yml for the keycloak service, define these
   environment variables:

   - MYSQL_PORT_3306_TCP_ADDR=mysql
   - MYSQL_PORT_3306_TCP_PORT=3306

   2.

   Option-2: run the keycloak and mysql services on the default “bridge”
   network:
   In the keycloak and mysql service definitions:

   network_mode: bridge

   Separately:

   networks:
    default:
      external:
        name: bridge


Bottom line question:

   - Why does JBoss behave differently when trying to connect to mysql on
   the global “bridge” network (works) vs the project-specific default network
   (fails)?


Jonathan

--
Jonathan D'Andries
http://www.linkedin.com/in/jonathandandries/


More information about the keycloak-user mailing list