docker compose容器 mysql启动过程中自动执行初始化数据库脚本

背景

在一次编写docker-compose过程中,我希望创建的mysql容器能够自动执行我的初始化脚本。

初始版本

部分docker compose文件配置如下:

yml 复制代码
services:
  mysql:
    image: mysql:5.7
    container_name: my-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
      - TZ=${TIMEZONE}
    command:
      --max_connections=100
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
      --tls_version="TLSv1.2,TLSv1.3"
      --init-file /data/application/init.sql
    ports:
      - ${MYSQL_PORT}:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-uroot", "-p${MYSQL_PASSWORD}"]
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 40s
    restart: always

上面脚本的中我在command中加入了--init-file /data/application/init.sql命令,执行过后发现确实初始化了脚本。但是每次重启都会再次执行一次sql脚本,这显然不是我想要的。

升级版本

经过一番探索,发现在mysql5.7的镜像中,制作者已经考虑到了初始化脚本的问题。详情查看docker-entrypoint.sh

shell 复制代码
		for f in /docker-entrypoint-initdb.d/*; do
			case "$f" in
				*.sh)     echo "$0: running $f"; . "$f" ;;
				*.sql)    echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;;
				*.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;
				*)        echo "$0: ignoring $f" ;;
			esac
			echo
		done

这段代码的主要目的是在 MySQL 容器启动时,自动处理并执行 /docker-entrypoint-initdb.d/ 目录下的所有 .sh、.sql 和 .sql.gz 文件,完成数据库的初始化操作。

yml 复制代码
services:
  mysql:
    image: mysql:5.7
    container_name: my-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
      - TZ=${TIMEZONE}
    command:
      --max_connections=100
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
      --tls_version="TLSv1.2,TLSv1.3"
    ports:
      - ${MYSQL_PORT}:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-uroot", "-p${MYSQL_PASSWORD}"]
      interval: 10s
      timeout: 10s
      retries: 3
      start_period: 40s
    restart: always

去除init-file命令,把初始化脚本挂在在docker-entrypoint-initdb.d目录下,进行验证发现只有容器第一次创建时会初始化脚本。满足我们的需求。

总结

要在mysql容器初次创建过程中,执行sql脚本,只需要把sql脚本放到/docker-entrypoint-initdb.d下即可。文章参考docker:mysql启动时自动执行初始建表脚本

相关推荐
极限实验室15 分钟前
Easysearch 冷热架构实战
数据库
不学习何以强国19 分钟前
Cool Unix + OpenAuth.Net 实现一款校园小程序的开发
mysql·前端框架·asp.net
Lu Yao_3 小时前
Redis 持久化
数据库·redis·缓存
June`3 小时前
Redis5安装与核心命令详解
数据库·redis·缓存
安当加密6 小时前
达梦数据库TDE透明加密解决方案:构建高安全数据存储体系
网络·数据库·安全
Jabes.yang8 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
阿巴~阿巴~9 小时前
Redis 核心文件、命令与操作指南
数据库·redis·缓存·客户端·服务端
koping_wu9 小时前
【Redis】用Redis实现分布式锁、乐观锁
数据库·redis·分布式
做运维的阿瑞10 小时前
Docker 从入门到精通:完整通关笔记
笔记·docker·容器
abcefg_h10 小时前
关系型数据库与非关系型数据库
数据库·nosql