Java.net.ConnectException:Docker + Keycloak 拒绝连接

Java.net.ConnectException: Connection refused on Docker + Keycloak

我是 Docker 的新手,我很难将 Keycloak 连接到我的本地 MySQL 数据库。有没有人知道发生了什么事?这是我的Docker文件:

FROM jboss/keycloak:14.0.0

ADD JDBC_PING.cli /opt/jboss/tools/cli/jgroups/discovery/
USER root

ENV DB_VENDOR MYSQL
ENV DB_ADDR host.internal.docker
ENV DB_PORT 3306
ENV DB_DATABASE keycloak
ENV DB_USER root
ENV DB_PASSWORD mydbpass
ENV PROXY_ADDRESS_FORWARDING true
ENV KEYCLOAK_USER admin
ENV KEYCLOAK_PASSWORD mykcpass
ENV PROXY_ADDRESS_FORWARDING true
ENV JGROUPS_DISCOVERY_PROTOCOL JDBC_PING
ENV JGROUPS_DISCOVERY_PROPERTIES datasource_jndi_name=java:jboss/datasources/KeycloakDS
ENV CACHE_OWNERS_COUNT 2
ENV CACHE_OWNERS_AUTH_SESSIONS_COUNT 2
ENV JAVA_OPTS -server -Xms8048m -Xmx8048m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=512m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS,com.newrelic -Djava.awt.headless=true


COPY . /project
RUN cd /project && ./mvnw clean package

FROM jboss/keycloak:14.0.0
USER root
COPY --from=0 /project/target/*.jar /opt/jboss/keycloak/standalone/deployments/app.jar
USER 1000

ENV KEYCLOAK_HTTP_PORT 80
ENV KEYCLOAK_HTTPS_PORT 443
EXPOSE 8080
EXPOSE 8443

错误日志显示

FATAL [org.keycloak.services] (ServerService Thread Pool -- 59) Error during startup: java.lang.RuntimeException: Failed to connect to database

...............
Caused by: java.net.ConnectException: Connection refused (Connection refused)
        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
        at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
        at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.base/java.net.Socket.connect(Socket.java:609)
        at com.mysql.jdbc@8.0.22//com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
        at com.mysql.jdbc@8.0.22//com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)
        ... 64 more

已采取的步骤:

任何帮助将不胜感激!!

在多阶段构建中,每个 FROM 行都会完全重置 ENV 设置,因此第一阶段的设置不会出现在最终图像中。

FROM jboss/keycloak:14.0.0 AS build
ENV DB_VENDOR MYSQL
...
FROM jboss/keycloak:14.0.0  # resets ENV settings
RUN echo $DB_VENDOR         # will be empty

一般来说,运行 时间或部署时设置(如数据库位置和凭据)不应编译到您的 Docker 文件中。 (当您将映像部署到不同的地方时,您不想重建映像,并且可以很容易地从构建的映像中提取凭据。)如果您 运行 通过 Docker 撰写,您可以将这些特定于环境的设置放入 docker-compose.yml 文件中,或者 use an external environment file:

version: '3.8'
services:
  keycloak:
    build: .
    # env_file: keycloak.env  # would replace the settings below
    environment:
      DB_ADDR: host.internal.docker
      DB_USER: root
      DB_PASSWORD: password
      ET: cetera