连接被拒绝: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.
我必须使用 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.