gpt4 book ai didi

mysql - Docker compose 等待数据库服务初始化

转载 作者:可可西里 更新时间:2023-11-01 07:38:22 30 4
gpt4 key购买 nike

我有一个 spring boot 项目,我想使用 docker 对其进行容器化。我有几个连接到同一个 MySql 服务器的 spring boot 应用程序。

我的 spring 应用程序需要完全设置数据库(即创建所有表并将一些数据插入到某些表中)才能开始。

我正在使用 Docker 版本 18.09.0docker-compose 版本 1.23.1 和 ubuntu < strong>16.04 LTS


我有两个文件 create.sql insert.sql ,我用它来初始化应用程序要使用的数据库。

我使用命令 docker-compose.yml 创建图像 它成功运行并创建了图像。

我有以下问题。

  1. 我假设在使用 docker-compose 时,容器会在其所有依赖容器启动后立即启动。在我的 API 容器启动之前,有没有办法等待 mysql 服务器启动并准备好接受连接?

  2. 如果我选择为应用程序和 mysql 单独创建容器,而不使用 docker-compose,我如何确保我的应用程序连接到 mysql 容器?

  3. 还有其他工具可以帮助我实现这一目标吗?

注意:我尝试使用 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

最佳答案

使用 docker-compose 的 healthcheck 功能 (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 容器健康之前,依赖容器不会启动

关于mysql - Docker compose 等待数据库服务初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407287/

30 4 1
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com