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



我有一个在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

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

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

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

解决了问题。

最新更新