Skip to content

自动执行数据库更新脚本

docker compose自动执行数据库更新脚本

自动执行数据库更新脚本参考 链接

用于初始化数据库的脚本init.sql

sql
-- 用于初始化数据库脚本

CREATE DATABASE IF NOT EXISTS demo_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE demo_db;

CREATE TABLE IF NOT EXISTS `auth`(
    id                  BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    account             VARCHAR(64) NOT NULL UNIQUE COMMENT '账号',
    `password`          VARCHAR(64) NOT NULL COMMENT '密码',
    create_time         DATETIME NOT NULL COMMENT '创建时间'
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

用于模拟更新数据库的脚本update.sql

sql
-- 用于更新数据库脚本

insert into `auth`(`account`,`password`,`create_time`) values ('user1', '123456', now());

用于编译容器镜像的Dockerfile

dockerfile
FROM mariadb:10.4.19

RUN apt-get update
RUN apt-get install -y curl

ENV DOCKERIZE_VERSION v0.6.1
RUN curl --silent --output dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz https://bucketxyh.oss-cn-hongkong.aliyuncs.com/docker/dockerize-linux-amd64-v0.6.1.tar.gz
RUN tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

COPY init.sql /docker-entrypoint-initdb.d/
COPY update.sql /update.sql

用于启动演示的docker-compose.yaml

yaml
version: "3.0"

services:
  db:
    build:
      context: ./
    image: demo-db:latest
    command:
     - --character-set-server=utf8mb4
     - --collation-server=utf8mb4_general_ci
     - --skip-character-set-client-handshake
     - --innodb-buffer-pool-size=1g
    environment:
      - LANG=C.UTF-8
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456

  db-updater:
    image: demo-db:latest
    environment:
      - TZ=Asia/Shanghai
    command: sh -c "dockerize -wait tcp://db:3306 -timeout 120s -wait-retry-interval 5s
      && mysql -uroot -p123456 -P3306 -hdb demo_db < /update.sql
      && echo \"成功执行更新数据库脚本\""

上面的docker-compose.yaml文件中的db-updater会自动执行容器内的/update.sql脚本

启动数据库

bash
docker compose up -d

删除数据库

bash
docker compose down -v