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

相关推荐
野犬寒鸦1 小时前
从零起步学习MySQL || 第九章:从数据页的角度看B+树及MySQL中数据的底层存储原理(结合常见面试题深度解析)
java·服务器·数据库·后端·mysql·oracle·1024程序员节
热爱运维的小七1 小时前
从传统架构到云原生,如何应对数据增长挑战?
数据库·it运维·devops·1024程序员节
Coding_Doggy1 小时前
苍穹外卖是如何从0搭建一个标准的 Maven 多模块项目的?
java·数据库·maven
方二华2 小时前
5 mysql源码中B+树的构建
数据库·mysql·1024程序员节
侯喵喵2 小时前
Jetson orin agx配置ultralytics 使用docker或conda
yolo·docker·1024程序员节·ultralytics
望获linux4 小时前
【Linux基础知识系列:第一百五十九篇】磁盘健康监测:smartctl
linux·前端·数据库·chrome·python·操作系统·软件
西部风情4 小时前
聊聊并发、在线、TPS
android·java·数据库
小彭律师4 小时前
Docker/K8s部署MySQL的创新实践与优化技巧大纲
mysql·docker·kubernetes
lastHertz4 小时前
Docker 占用导致 C 盘空间不足的排查与解决
运维·docker·容器