Keycloak Docker 集群未从 JDBC_PING 数据库中删除

Keycloak Docker Cluster not removing from JDBC_PING database

我在 docker 主机上有一个 Keycloak 独立 HA 集群 运行。集群使用 JDBC Ping 到 PostgreSQL 数据库进行发现(因为这最终将在 ECS 上 运行,因此没有多播)。

集群发现运行良好,每个节点都会在启动时将自己添加到数据库中。但是,当使用 "docker stop" 停止时,它们不会自行删除。这很好,只要至少有一个其他节点在运行,因为它们会自动检测关闭的节点并重新平衡,但如果最后一个节点关闭,最后一行将保留。然后,当一个新节点启动时,它将尝试连接到陈旧节点并失败。

JGroups TCP 堆栈如下所示

<stack name="tcp">
<transport type="TCP" socket-binding="jgroups-tcp">
    <property name="external_addr">
        ${env.EXTERNAL_ADDR}
    </property>
</transport>
<protocol type="org.jgroups.protocols.JDBC_PING">
    <property name="connection_driver">
        org.postgresql.Driver
    </property>
    <property name="connection_url">
        jdbc:postgresql://${env.DB_ADDR:postgres}:${env.DB_PORT:5432}/${env.DB_DATABASE:keycloak}
    </property>
    <property name="connection_username">
        ${env.DB_USER:keycloak}
    </property>
    <property name="connection_password">
        ${env.DB_PASSWORD:password}
    </property>
    <property name="initialize_sql">
        CREATE TABLE IF NOT EXISTS JGROUPSPING ( own_addr varchar(200) NOT NULL, cluster_name varchar(200) NOT NULL, ping_data bytea DEFAULT NULL, added timestamp DEFAULT NOW(), PRIMARY KEY (own_addr, cluster_name))
    </property>
</protocol>
<protocol type="MERGE3"/>
<protocol type="FD_SOCK"/>
<protocol type="FD_ALL"/>
<protocol type="VERIFY_SUSPECT"/>
<protocol type="pbcast.NAKACK2"/>
<protocol type="UNICAST3"/>
<protocol type="pbcast.STABLE"/>
<protocol type="pbcast.GMS"/>
<protocol type="MFC"/>
<protocol type="FRAG2"/>
</stack>

Dockerfile 是

FROM jboss/keycloak:latest

# elevate to install iproute
USER root
RUN yum install -y iproute

USER jboss

ADD cli/* /opt/jboss/keycloak/cli/
RUN cd /opt/jboss/keycloak \
  && bin/jboss-cli.sh --file=cli/setup.cli \
  && rm -rf /opt/jboss/keycloak/standalone/configuration/standalone_xml_history

RUN sed -i -e "/.*<\/dependencies>$/i \ \ \ \ \ \ \ \ <module 
name=\"org.postgresql.jdbc\"\/>" 
/opt/jboss/keycloak/modules/system/layers/base/org/jgroups/main/module.xml

ADD start.sh /opt/jboss/

ENTRYPOINT [ "/opt/jboss/start.sh" ]
CMD ["-b", "0.0.0.0", "--server-config", "standalone-ha.xml"]

EXPOSE 7600

并且startup.sh包含

#!/bin/sh

DEFAULT_NIC=`ip route | grep default | awk '{print $NF}'`
export EXTERNAL_ADDR=`ip -f inet -o addr show $DEFAULT_NIC | cut -d" " -f 7 | cut -d/ -f 1`

if [ "$EXTERNAL_ADDR" = "" ]; then
    EXTERNAL_ADDR=127.0.0.1
fi


sh /opt/jboss/docker-entrypoint.sh $@ -Djgroups.bind_addr=$EXTERNAL_ADDR -Djboss.bind.address.private=$EXTERNAL_ADDR -Djboss.bind.address.management=$EXTERNAL_ADDR -Djgroups.bind.address=$EXTERNAL_ADDR -Djava.net.preferIPv4Stack=true -Dignore.bind.address=true

真的看不出这不会被删除的原因。我在这里犯了任何明显的配置错误吗?

这里的问题是 运行 docker-entrypoint.sh 使用 sh 而不是 exec。将行更改为

exec ./docker-entrypoint.sh $@ -Djgroups.bind_addr=$EXTERNAL_ADDR

解决了问题。