如何在首次构建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
相关产品推荐
相关产品推荐

