You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在首次构建MySQL镜像容器后执行指定SQL文件

实现MySQL容器首次启动自动执行初始化脚本

问题说明

我将data.sql与Dockerfile、docker-compose.yml放在同一目录下,希望首次基于MySQL镜像构建并启动容器时,自动执行data.sql中的数据库初始化命令。

现有文件内容

data.sql

create database db1;
create database db2;
create database db3;
create database db4;
GRANT ALL PRIVILEGES on db1.* to 'NORMAL_USER'@'%';
GRANT ALL PRIVILEGES on db2.* to 'NORMAL_USER'@'%';
GRANT ALL PRIVILEGES on db3.* to 'NORMAL_USER'@'%';
GRANT ALL PRIVILEGES on db4.* to 'NORMAL_USER'@'%'; 

原Dockerfile

ADD data.sql data.sql

原docker-compose.yml

version: '3.3'
services:
  mysql:
    container_name: mysql
    image: mysql
    build:
      dockerfile: ./Dockerfile
    environment:
      MYSQL_ROOT_PASSWORD: ROOT_USER_PASS
      MYSQL_USER: NORMAL_USER
      MYSQL_PASSWORD: NORMAL_USER_PASS
    ports:
      - "5000:3306"
    networks:
      - internal_net
    volumes:
      - mysql
    restart: unless-stopped
networks:
  internal_net:
    driver: bridge

volumes:
  mysql:

解决方案

MySQL官方镜像内置了初始化逻辑:首次启动容器时,会自动执行/docker-entrypoint-initdb.d/目录下的.sql、.sql.gz或.sh文件。只需调整Dockerfile,把初始化脚本放到指定目录即可。

修改Dockerfile

将data.sql复制到容器内的/docker-entrypoint-initdb.d/目录,确保镜像启动时能触发初始化:

ADD data.sql /docker-entrypoint-initdb.d/data.sql

配置说明

  • 你的docker-compose.yml无需修改,现有配置已满足需求。
  • 首次启动容器时,MySQL会自动执行初始化脚本;后续重启容器(未删除数据卷)不会重复执行,因为数据卷mysql会保留已初始化的数据库数据。
  • 若需重新执行初始化脚本,需先删除数据卷再重建容器:
    docker-compose down -v
    docker-compose up -d
    

验证步骤

容器启动后,可通过以下命令验证初始化结果:

# 进入MySQL容器
docker exec -it mysql mysql -u root -pROOT_USER_PASS

# 查看已创建的数据库
SHOW DATABASES;

# 检查普通用户的权限
SHOW GRANTS FOR 'NORMAL_USER'@'%';

内容的提问来源于stack exchange,提问作者Soumalya Bhattacharya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:46:08