连接被拒绝:docker-compose 上的 Jetty 上的 webapp 运行 上的 mariaDB

Connection refused : mariaDB on a webapp running on Jetty on docker-compose

我必须使用 Jetty 服务器部署 Web 应用程序。此应用程序需要 MariaDB 上的数据库 运行。此处用于部署应用程序的 docker-compose 文件:

version: '3.0'

services:

  jetty:
    build:
      context: .
      dockerfile: docker/jetty/Dockerfile
    container_name: app-jetty
    ports:
      - "8080:8080"
    depends_on:
      - mariadb
    networks:
      - app
    links:
      - "mariadb:mariadb"

  mariadb:
    image: mariadb:10.7
    container_name: app-mariadb
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: myPassword
      MARIADB_DATABASE: APPBD
    ports:
      - "3307:3306"
    networks:
      - app
  
  adminer:
    image: adminer
    container_name: app-adminer
    restart: always
    ports:
      - "2002:8080"
    depends_on:
      - mariadb
    networks:
      - app

networks:
  app:
    driver: bridge

Jetty容器使用的Dockerfile

FROM gradle:7.2-jdk17 as grad

WORKDIR /tmp
RUN mkdir src
RUN ls -la
COPY src /tmp/src
COPY build.gradle /tmp/build.gradle
RUN ls -la
RUN gradle --warning-mode all war
RUN ls -la /tmp/build/libs/

FROM jetty:latest
COPY --from=grad /tmp/build/libs/tmp.war /var/lib/jetty/webapps/ROOT.war
EXPOSE 8080

应用程序是在 Jetty 初始化之前使用 Gradle 构建的。

问题出在数据库上:初始化 MariaDB 数据库需要几分钟时间。所以,当我想从 Adminer 连接到数据库时,我必须等到数据库准备好才能登录。但是对于我的应用程序,我得到了这个:Could not connect to address=(host=mariadb)(port=3306)(type=master) : Socket fail to connect to host:mariadb, port:3306. Connection refused,即使数据库已经准备好了。我必须停止 app-jetty 容器并重新启动它才能使用数据库。我认为 depends_on 将 运行 数据库准备就绪时 app-jetty,但当 app-mariadb 为 运行 时 运行 容器。

我使用 JDBC 建立与数据库的连接:jdbc:mariadb://mariadb:3306/APPBD?user=root&password=myPassword。我成功地与 gradle appRun 建立了本地执行连接,并使用 localhost:3306 而不是 mariadb:3306,所以我认为我的代码没有任何错误。

如何指示 app-jetty 容器仅在 MariaDB 准备就绪时启动?

Compose (2.1) 支持健康检查:

mariadb服务下:

    healthcheck:
        test: [ "CMD", "mariadb-admin", "--protocol", "tcp" ,"ping" ]
        timeout: 3m
        interval: 10s
        retries: 10

参考:tip.