docker对MySQL初始化脚本执行

-v /data/mysql-docker/mysql_init:/docker-entrypoint-initdb.d 是 Docker 运行容器时的一个参数,用于将宿主机(主机)的目录挂载到容器内的特定目录。以下是其具体含义和作用的详细解释:


1. 参数含义

  • -v:Docker 的卷(Volume)挂载参数,用于将宿主机的目录或文件挂载到容器内。
  • /data/mysql-docker/mysql_init宿主机的目录路径,即你本地存储初始化脚本的目录。
  • /docker-entrypoint-initdb.d容器内的目标目录路径,这是 Docker 官方镜像(如 MySQL、PostgreSQL 等)预设的初始化脚本执行目录。

2. 核心作用

通过这个挂载命令,你可以将宿主机上自定义的初始化脚本(如 SQL 文件或 Shell 脚本)复制到容器内的 /docker-entrypoint-initdb.d 目录。当容器启动时,Docker 会自动执行该目录下的脚本,用于初始化数据库或其他配置。


3. 具体场景

  • 适用于官方数据库镜像:例如 mysqlpostgres 等官方镜像,在容器首次启动时,会自动检查 /docker-entrypoint-initdb.d 目录中的脚本并执行。
  • 常见用途
    • 创建数据库和用户。
    • 导入初始数据(如 .sql 文件)。
    • 配置数据库参数(如通过 Shell 脚本执行 mysql 命令)。

4. 执行过程

  1. 挂载目录:宿主机的 /data/mysql-docker/mysql_init 目录被挂载到容器的 /docker-entrypoint-initdb.d
  2. 容器启动时触发:当容器启动时,Docker 的入口脚本(entrypoint.sh)会自动遍历 /docker-entrypoint-initdb.d 目录中的文件。
  3. 按文件名顺序执行
    • .sh 文件:作为 Shell 脚本执行。
    • .sql 文件:通过数据库客户端(如 mysqlpsql)导入到数据库中。
    • 文件执行顺序按名称的字母顺序排列(如 001_init.sql 会先于 002_data.sql 执行)。

5. 注意事项

根据知识库中的信息(特别是条目 [3] 和 [5]),使用时需注意以下问题:

(1) 权限问题
  • 脚本可执行权限:如果挂载的是 Shell 脚本(.sh),需确保文件有可执行权限。
    解决方法:在宿主机上执行 chmod +x /data/mysql-docker/mysql_init/*.sh
  • 文件所有者权限:容器内的用户(如 mysql 用户)需有权访问这些文件。
    解决方法:在宿主机上调整文件所有者:chown -R 1000:1000 /data/mysql-docker/mysql_init(假设容器内用户 UID/GID 为 1000)。
(2) 脚本兼容性
  • 文件扩展名必须正确:只有以 .sh.sql 结尾的文件会被自动执行。
  • 脚本内容错误:如果脚本有语法错误或依赖未安装的工具,会导致初始化失败。
(3) 环境变量依赖
  • 如果脚本依赖环境变量(如 MYSQL_ROOT_PASSWORD),需确保容器内已正确设置这些变量。
    示例:在 docker run 命令中添加 -e MYSQL_ROOT_PASSWORD=your_password

6. 示例场景

假设你的宿主机目录 /data/mysql-docker/mysql_init 包含以下文件:

/data/mysql-docker/mysql_init/
├── 01_create_db.sql
└── 02_import_data.sh
  • 01_create_db.sql(SQL 文件):

    CREATE DATABASE mydb;
    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'%';
    
  • 02_import_data.sh(Shell 脚本):

    #!/bin/bash
    mysql -u root -p"$MYSQL_ROOT_PASSWORD" mydb < /path/to/data.sql
    

当运行 docker run -v /data/mysql-docker/mysql_init:/docker-entrypoint-initdb.d ... mysql:latest 时:

  1. 容器启动时,01_create_db.sql 会被自动执行,创建数据库和用户。
  2. 02_import_data.sh 会被执行,导入数据(需确保脚本有可执行权限)。

7. 其他相关知识

  • docker-entrypoint-initdb.d 的设计目的(来自知识库条目 [1] 和 [5]):
    • 初始化数据库实例。
    • 设置环境变量(如 DATABASE_HOSTDATABASE_PORT)。
    • 根据环境变量配置数据库连接。
  • 常见错误处理(来自知识库条目 [3]):
    • 权限被拒绝:检查脚本权限和所有者。
    • 脚本未执行:确认文件扩展名正确且无语法错误。

你可能感兴趣的:(笔记,docker,mysql,容器)