[英]Can't connect Java and MySQL on docker
當我運行 docker compose 時,它返回錯誤
引起:java.net.ConnectException:連接被拒絕(連接被拒絕)
我對 docker 沒有太多經驗。我做錯了什么?
我的 docker 組成:
version: '3.5'
services:
mysql-service:
image: mysql:5.7
networks:
- phonebook-network
environment:
- MYSQL_ROOT_PASSWORD=admin
- MYSQL_USER=admin
- MYSQL_PASSWORD=admin
- MYSQL_DATABASE=PhoneBook
restart: on-failure
phonebook-service:
build:
context: ./
args:
JAR_FILE: ./Phonebook-0.0.1-SNAPSHOT.jar
ports:
- "8080:8080"
environment:
- DB_HOST=jdbc:mysql://mysql-service:3306/PhoneBook?useTimezone=true&serverTimezone=UTC&useSSL=false
- DB_USERNAME:admin
- DB_PASSWORD:admin
networks:
- phonebook-network
depends_on:
- mysql-service
restart: on-failure
networks:
phonebook-network:
driver: bridge
我的 dockerfile:
FROM openjdk:11-jdk-slim
VOLUME /phoneBook
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
首先,確保端口也暴露在 MySQL 中:
services:
mysql-service:
image: mysql:5.7
networks:
- phonebook-network
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=admin
- MYSQL_USER=admin
- MYSQL_PASSWORD=admin
- MYSQL_DATABASE=PhoneBook
restart: on-failure
“depends_on”配置不能解決容器啟動順序的問題?
是的, depends_on
確保 MySQL 容器將在 Java 之前啟動,但可能會發生 MySQL 本身需要很長時間才能啟動,因此容器內部沒有准備好。
如果問題仍然存在,這可能是一個可能的解決方案:在項目的根目錄下創建一個docker_entrypoint.sh
文件。 這也假設容器安裝了netcat
。
#!/usr/bin/env bash
echo "Waiting for MySQL..."
# I'm assuming you're running it in a default port (3306)
until nc -vz "mysql-service" 3306; do
>&2 echo "Waiting for MySQL to be available..."
sleep 0.1
done
echo "MySQL started"
java -jar /app.jar
然后修改您的 Dockerfile:
FROM openjdk:11-jdk-slim
VOLUME /phoneBook
ARG JAR_FILE
RUN apt-get update --fix-missing \
&& apt-get install -y --no-install-recommends netcat \
&& rm -rf /var/lib/apt/lists/*
COPY ${JAR_FILE} app.jar
COPY ./docker_entrypoint.sh docker_entrypoint.sh
RUN chmod 100 docker_entrypoint.sh
ENTRYPOINT [ "./docker_entrypoint.sh" ]
我現在沒有辦法測試這個,但讓我知道這是否有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.