mysql - Docker compose 等待数据库服务初始化
问题描述
我有一个 Spring Boot 项目,我想使用 docker 对其进行容器化。我有几个连接到同一个 MySql 服务器的 spring boot 应用程序。
我的 spring 应用程序需要完全设置数据库(即要创建的所有表和要在某些表中插入的一些数据)才能启动。
我正在使用Docker版本18.09.0和docker -compose版本1.23.1和 ubuntu 16.04 LTS
我有两个文件create.sql
和insert.sql
,用于初始化应用程序要使用的数据库。
我使用命令创建图像docker-compose.yml
,它成功运行并创建图像。
我有以下问题。
我假设在使用 docker-compose 时,容器会在其所有依赖容器启动后立即启动。在我的 API 容器启动之前,有没有办法等待 mysql 服务器启动并准备好接受连接?
如果我选择为应用程序和 mysql 分别创建容器,而不使用 docker-compose,我如何确保我的应用程序连接到 mysql 容器?
有没有其他工具可以帮助我实现这一目标?
注意:
我曾尝试使用docker inspect <container_id>
查找 mysql 容器的 IpAddress 并使用它进行连接,但效果不佳。
以下是我用来创建图像的文件。
docker-compose.yml
文件。
version: '3'
services:
demo-mysql:
image: demo-mysql
build: ./demo-mysql
volumes:
- /mnt/data/mysql-data:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=demo
- MYSQL_PASSWORD=root
demo-api:
image: demo-api-1.0
build: ./api
depends_on:
- demo-mysql
ports:
- 8080:8080
environment:
- DATABASE_HOST=demo-mysql
- DATABASE_USER=root
- DATABASE_PASSWORD=root
- DATABASE_NAME=demo
- DATABASE_PORT=3306
demo1-app:
image: demo1-app-1.0
build: ./demo1
depends_on:
- demo-mysql
ports:
- 8090:8090
environment:
- DATABASE_HOST=demo-mysql
- DATABASE_USER=root
- DATABASE_PASSWORD=root
- DATABASE_NAME=demo
- DATABASE_PORT=3306
以下是Dockerfile
spring boot项目的
FROM java:8
VOLUME /tmp
ARG DATA_PATH=/src/main/resources
ARG APP_PORT=8080
EXPOSE ${APP_PORT}
ADD /build/libs/demo-api.jar demo-api.jar
ENTRYPOINT ["java","-jar","demo-api.jar"]
以下是Dockerfile
我用来创建我的mysql图像的
FROM mysql:5.7
ENV MYSQL_DATABASE=demo \
MYSQL_USER=root \
MYSQL_ROOT_PASSWORD=root
ADD ./1.0/create.sql /docker-entrypoint-initdb.d
ADD ./1.0/insert.sql /docker-entrypoint-initdb.d
EXPOSE 3306
解决方案
使用healthcheck
docker-compose 的功能(https://docs.docker.com/compose/compose-file/#healthcheck)。像这样的东西:
services:
demo-mysql:
image: demo-mysql
build: ./demo-mysql
volumes:
- /mnt/data/mysql-data:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=demo
- MYSQL_PASSWORD=root
healthcheck:
test: ["CMD-SHELL", 'mysqladmin ping']
interval: 10s
timeout: 2s
retries: 10
在 demo-mysql 容器健康之前,依赖的容器不会启动
推荐阅读
- pyspark - parquet 中的 Athena 类型 INT64 与表模式中定义的类型 double 不兼容
- google-sheets - 数组公式和计数
- google-apps-script - Google Sheets Scripts - 对于范围内的每个单元格,获取单元格具有特定值的行号,将行复制到范围内的第一个空白行
- controller - 如何在嵌入式Linux(SIM800)中配置PPP
- assembly - 有谁知道为什么在 Visual Studio 2019 上使用 masm 代码时会弹出此错误?
- reactjs - 反应复选框控件
- java - 是否有可能或是否有人知道更改 AMQ 消息的 JMSTimestamp 以发送到代理的方法?
- reactjs - 在 react js 应用程序的 package.json 中添加主页后,图像不显示
- java - whitelabel 错误页面尝试使用 mysql 数据库部署休眠 Spring Web 应用程序
- c# - asp.net mvc 代码中的日期验证优先方法