如何在第一次构建mysql映像的容器后执行sql文件

92dk7w1h  于 2023-02-07  发布在  Mysql
关注(0)|答案(1)|浏览(96)

我有一个data.sql文件在同一个文件夹中作为Dockerfiledocker-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:
c2e8gylq

c2e8gylq1#

在开始添加此功能之前,我们需要docker-compose.yml中的当前错误:卷mysql需要一个装载位置。我怀疑它应该作为数据目录装载到/var/lib/mysql。如果它应该装载到其他位置,请更正路径:

...
services:
  mysql:
    ...
    volumes:
      - mysql:/var/lib/mysql
    ...

hub.docker.com page of the MySQL container初始化新示例下指出:
第一次启动容器时,将创建一个具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为.sh.sql.sql.gz的文件,这些文件在/docker-entrypoint-initdb.d中找到。文件将按字母顺序执行...
该脚本只在data目录(默认为/var/lib/mysql)中找不到数据时才执行,因此,我们可以简单地通过volumedocs.docker.com)将data.sql挂载到该目录:

...
services:
  mysql:
    ...
    volumes:
      - mysql:/var/lib/mysql
      - ./data.sql:/docker-entrypoint-initdb.d/data.sql:ro
    ...

相关问题