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启动时自动执行初始建表脚本

相关推荐
岁岁种桃花儿6 小时前
MySQL从入门到精通系列:InnoDB记录存储结构
数据库·mysql
java_logo6 小时前
OpenProject Docker 容器化部署指南:从快速启动到生产环境配置
docker·容器·openproject·openproject部署·openproject部署手册·openproject部署方案·openproject部署教程
jiunian_cn7 小时前
【Redis】hash数据类型相关指令
数据库·redis·哈希算法
曦云沐7 小时前
【避坑指南】Ubuntu更新报错“Repository is not signed”的快速修复
linux·ubuntu·docker
冉冰学姐7 小时前
SSM在线影评网站平台82ap4(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·在线影评平台·影片分类
Exquisite.8 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
知识分享小能手8 小时前
SQL Server 2019入门学习教程,从入门到精通,SQL Server 2019数据库的操作(2)
数据库·学习·sqlserver
cg_ssh9 小时前
Docker 下启动 Nacos 3.1.1 单机模式
运维·docker·容器
修己xj9 小时前
使用 Docker 部署 SQL Server 并导入 .mdb 文件的完整指南
运维·docker·容器
踩坑小念9 小时前
秒杀场景下如何处理redis扣除状态不一致问题
数据库·redis·分布式·缓存·秒杀