我必須使用 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
在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 建立與 DB 的連接:jdbc:mariadb://mariadb:3306/APPBD?user=root&password=myPassword。我成功地在本地執行上建立連接gradle appRun并使用localhost:3306而不是mariadb:3306,所以我認為我的代碼沒有任何錯誤。
如何app-jetty僅在 MariaDB 準備好時才向容器指示啟動?
uj5u.com熱心網友回復:
Compose (2.1) 支持健康檢查:
在 mariadb 服務下:
healthcheck:
test: [ "CMD", "mariadb-admin", "--protocol", "tcp" ,"ping" ]
timeout: 3m
interval: 10s
retries: 10
參考:提示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/398541.html
