簡體   English   中英

在 docker 上無法連接 Java 和 MySQL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM