docker compose等待数据库服务初始化

yftpprvb  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(514)

我有一个SpringBoot项目,我想使用docker进行集装箱化。我有几个spring引导应用程序连接到同一个mysql服务器。
我的spring应用程序需要完全设置数据库(即所有要创建的表和一些要插入到某些表中的数据)才能启动。
我使用的是DockerVersion18.09.0和DockerComposeVersion1.23.1以及Ubuntu16.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
qojgxg4l

qojgxg4l1#

使用 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

在演示mysql容器运行正常之前,依赖的容器不会启动

相关问题