java - 无法在 docker 上连接 Java 和 MySQL
问题描述
当我运行 docker compose 时,它返回错误
引起:java.net.ConnectException:连接被拒绝(连接被拒绝)
我对码头工人没有太多经验..我做错了什么?
我的码头工人撰写:
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"]
解决方案
首先,确保端口也在 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" ]
我现在没有办法测试这个,但让我知道这是否有效。
推荐阅读
- azure - 通过 Terraform 部署应用程序网关时出错
- python - Python 替换了 datetime 的默认 __str__ 实现?
- payment-gateway - 如何显示 Klarna Payments 小部件中的表单?
- python - 重质阶跃函数的傅里叶变换
- python - 将配置文件中的多个字符串作为值的字典
- java - 如何将对象列表分组到地图中并使用java流为每个键选择不同类型的第一个对象?
- kofax - KTA 工作队列查询
- discord - 我如何解决我遇到的这个 discord.js 问题
- sql - 重叠采购订单的价值总和
- python - 如何根据张量流中的索引张量填充值张量?