docker 创建默认数据库mysql容器,mysql容器自带初始化数据

本文介绍了如何使用Dockerfile创建包含预初始化数据库的MySQL镜像,以及如何从已有MySQL容器制作镜像。Dockerfile方法通过执行SQL文件在构建过程中初始化数据库,而容器转镜像则需手动迁移数据并修改配置文件,确保数据被包含在新镜像中。这两种方法适用于快速部署带有特定数据库的MySQL实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前我所使用的两种方式:
通过dockerfile创建镜像和容器转镜像
dockerfile创建镜像:

FROM mysql:5.6.47 as builder
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]
ENV MYSQL_ROOT_PASSWORD=root
ENV MYSQL_DATABASE=root
# .sql文件可替换成对应库的SQL文件,文件路径可使用相对路径和绝对路径
COPY mysql.sql  /docker-entrypoint-initdb.d/
COPY ./mycustom.cnf /etc/mysql/conf.d/custom.cnf
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]
FROM mysql:5.6.47
COPY --from=builder /initialized-db /var/lib/mysql

dockerfile 初始化流程大致是先创mysql原始容器,在执行对应的sql文件创建数据库,而容器制作的镜像它在创建容器后就已经带有数据库了不需要再执行sql文件,当sql文件有几百M甚至G的时候容器镜像创建会特别快

容器转镜像:

通过已有的mysql容器制作镜像 因为mysql容器制作镜像时默认配置是不会把已有的数据也打包进镜像,所以如果只是单纯的容器转镜像,制作的镜像再转容器是不会带有数据的,可以参考以下方法:
整体逻辑就是自己创建的数据文件在另一个地方,打包的时候mysql配置文件 datadir 路径指向的是默认地址,所以只要把datadir 路径改成你自己数据库存放的路径就可以了。

1、在修改mysql容器 中的 新建目录 mdkir /workdir 这个地址可以随意。
2、 将 /var/lib/mysql 这个文件就存放着数据库文件 把这个复制 到新建目录中。
3、 修改 /etc/mysql/my.cnf 这个配置文件根据mysql不同可能会有所区别,主要就是找到一个有 “datadir =”配置的文件,将原来指向的地址改成你新建的地址
datadir = /workdir/mysql
因为 docker容器可能不存在vi或vim命令可以使用像sed命名等可以修改文件的命令
假如用sed命令注意路径转义 “/”
4、修改后退出 重启 容器就生效。
最后在执行 docker 容器转镜像命令
docker commit 容器id 镜像名:版本

结束

### 创建 MySQL Docker 容器初始化数据库的方法 #### 使用 `docker run` 命令挂载初始化脚本 为了使新创建MySQL 容器在首次启动时自动执行 SQL 脚本来完成数据表结构以及初始数据的设置,可以利用 `-v` 参数指定本地文件夹映射到容器内的 `/docker-entrypoint-initdb.d` 目录下[^3]。 ```bash docker run --name mysql-container \ -v /path/to/your/mysql-init-scripts:/docker-entrypoint-initdb.d \ -e MYSQL_ROOT_PASSWORD=myrootpassword \ -d mysql:latest ``` 这里假设主机上的 `/path/to/your/mysql-init-scripts` 文件夹包含了名为 `schema.sql`, `privileges.sql` 或其他任何 `.sql` 结尾的文件。这些文件会在容器第一次启动期间被执行以建立所需的模式和权限配置[^1]。 #### 编写自定义 Dockerfile 来构建带有预设配置的 MySQL 镜像 如果希望进一步定制化 MySQL 环境,则可以通过编写 Dockerfile 实现更复杂的初始化逻辑。下面是一个简单的例子: ```Dockerfile # FROM 指定基础镜像 FROM mysql:8.0.25 # COPY 将宿主机上的初始化脚本复制到特定位置 COPY ./init_scripts/* /docker-entrypoint-initdb.d/ # ENV 设置环境变量用于简化后续操作或者提供必要的参数给 MySQL Server ENV MYSQL_ROOT_PASSWORD=rootpass ``` 之后通过 `docker build . -t my-custom-mysql-image` 构建新的镜像,并用此镜像代替官方镜像来部署服务实例。 #### 利用 Docker Compose 进行多服务编排下的 MySQL 初始化 对于涉及多个微服务的应用场景来说,采用 Docker Compose 可以为整个项目定义一组相互关联的服务及其依赖关系。针对 MySQL 的部分可以在 `docker-compose.yml` 中加入如下片段实现自动化初始化过程[^2]: ```yaml version: '3' services: db: image: "mysql:8.0" environment: MYSQL_ROOT_PASSWORD: example volumes: - "./init_db:/docker-entrypoint-initdb.d" ``` 上述 YAML 片段同样会确保位于当前工作目录下的 `./init_db` 下的所有`.sql` 文件被加载至新建的数据卷中,在初次运行时由 MySQL 自动处理[^5]。 #### 执行额外命令进行手动初始化 (适用于交互式调试) 当需要临时测试某些功能或是解决复杂问题时,也可以进入正在运行中的 MySQL 容器内部直接调用客户端工具来进行查询或修改动作。例如: ```bash docker exec -it some-mysql mysql -uroot -p source /home/your_sql.sql; exit; ``` 这种方式适合于开发阶段快速验证想法而不必每次都重建完整的应用栈[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值