【问题标题】:Can't connect Java and MySQL on docker无法在 docker 上连接 Java 和 MySQL
【发布时间】:2021-04-30 16:23:51
【问题描述】:

当我运行 docker compose 时,它​​会返回错误

原因:java.net.ConnectException:连接被拒绝(连接 拒绝)

我对 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

我的码头文件:

FROM openjdk:11-jdk-slim
VOLUME /phoneBook
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

【问题讨论】:

  • 您能否显示您尝试从您的 java 容器连接 MySQL 的地址?
  • 应用程序是否在数据库准备好之前启动? (如果您在没有 -d 选项的情况下运行 docker-compose up,您是否看到在应用程序容器失败后显示数据库日志?)
  • 是的,它的 jdbc:mysql://localhost:3306/PhoneBook?useTimezone=true&serverTimezone=UTC
  • “depends_on”配置不能解决容器启动顺序的问题?

标签: java mysql docker docker-compose


【解决方案1】:

首先,确保端口也在 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" ]

我现在没有办法对此进行测试,但如果可行,请告诉我。

【讨论】:

  • 导致错误standard_init_linux.go:219: exec user process caused: exec format error
  • 我忘了把 #!/bin/bash 放在 sh 文件上。然后它只是打印 ./docker_entrypoint.sh: line 4: nc: command not found phonebook-service_1 |等待 MySQL 可用...
  • 容器需要安装netcat,我不确定openjdk图像是否使用debian。编辑以安装缺少的 dep。
猜你喜欢
  • 2015-04-30
  • 2020-07-24
  • 2018-10-10
  • 1970-01-01
  • 2018-10-02
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
相关资源
最近更新 更多