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

相关推荐
程序员岳焱22 分钟前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
FrankYoou27 分钟前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
隆里卡那唔42 分钟前
在dify中通过http请求neo4j时为什么需要将localhost变为host.docker.internal
http·docker·neo4j
疯子的模样44 分钟前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
计算机毕设定制辅导-无忧学长1 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
程序员柳1 小时前
基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot
数据库·微信小程序·layui
梦在深巷、2 小时前
MySQL/MariaDB数据库主从复制之基于二进制日志的方式
linux·数据库·mysql·mariadb
IT乌鸦坐飞机2 小时前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
IT_10242 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
Johny_Zhao3 小时前
Ubuntu系统安装部署Pandawiki智能知识库
linux·mysql·网络安全·信息安全·云计算·shell·yum源·系统运维·itsm·pandawiki