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

相关推荐
Little-Hu42 分钟前
QML TextEdit组件
java·服务器·数据库
保持学习ing3 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
发仔1233 小时前
Oracle与MySQL核心差异对比
mysql·oracle
宇钶宇夕3 小时前
EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
运维·服务器·数据库·程序人生·自动化
susu10830189114 小时前
Debian 11 Bullseye 在线安装docker
运维·docker·debian
爱可生开源社区4 小时前
SQLShift 重磅更新:支持 SQL Server 存储过程转换至 GaussDB!
数据库
贾修行4 小时前
SQL Server 空间函数从入门到精通:原理、实战与多数据库性能对比
数据库·sqlserver
傲祥Ax4 小时前
Redis总结
数据库·redis·redis重点总结
love530love4 小时前
Docker 稳定运行与存储优化全攻略(含可视化指南)
运维·人工智能·windows·docker·容器
人生匆匆5 小时前
docker进入启动失败的容器
运维·docker·容器