Docker 撰写等待数据库服务初始化

gre*_*wan 6 mysql docker spring-boot docker-compose

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

我的 spring 应用程序需要完全设置数据库(即要创建的所有表以及要在某些表中插入一些数据)才能启动。

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


我有两个文件create.sqlinsert.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
Run Code Online (Sandbox Code Playgroud)

以下是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"]
Run Code Online (Sandbox Code Playgroud)

以下是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
Run Code Online (Sandbox Code Playgroud)

Sim*_*ndi 4

使用healthcheckdocker-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
Run Code Online (Sandbox Code Playgroud)

在 demo-mysql 容器正常之前,依赖的容器不会启动

  • 健康检查不再有帮助,depends_on 的条件已在 docker 3 中删除,因此即使您添加 Spring Boot 应用程序以依赖于数据库,它也会等待它运行,而不是准备好。 (5认同)