Docker 编写 mysql 导入 .sql

Docker Compose mysql import .sql

我在使用 docker-compose 导入 .sql 转储文件时遇到问题。我遵循了文档,它显然将从 docker-entrypoint-initdb.d 加载 .sql 文件。但是,当我 运行 docker-compose up 时,sql 文件没有复制到容器中。

我试过使用 -vf 标志停止容器,但这也没有用。我的 .yml 脚本有什么问题吗?

我在 database/db-dump/ 目录中有 dump.sql,在我的撰写文件所在的根目录中。

frontend:
  image: myimage
  ports:
   - "80:80"
  links:
   - mysql
mysql:
  image: mysql
  ports:
   - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: rootpass
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: userpass
    MYSQL_DATABASE: myimage_db
  volumes:
   - ./database/db-dump:/docker-entrypoint-initdb.d

在多次尝试音量设置后,我找到了解决方法

我基于 mysql 创建了另一个镜像,在 Dockerfile

中包含以下内容
FROM mysql:5.6

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

然后从 compose 中删除卷和 运行 新图像

frontend:
  image: myimage
  ports:
   - "80:80"
  links:
   - mysql
mysql:
  image: mymysql
  ports:
   - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: rootpass
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: userpass
    MYSQL_DATABASE: myimage_db

这样转储总是被复制过来并且 运行 在启动时

这出现在 Docker MySQL 图片的文档页面上:https://hub.docker.com/_/mysql/

Initializing a fresh instance

When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data. SQL files will be imported by default to the database specified by the MYSQL_DATABASE variable.

Mysql 数据库转储 schema.sql 驻留在 /mysql-dump/schema.sql 目录并在初始化过程中创建表。

docker-compose.yml:

mysql:
    image: mysql:5.7
    command: mysqld --user=root
    volumes:
      - ./mysql-dump:/docker-entrypoint-initdb.d
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

这对我有用,

version: '3.1'

services:

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    volumes:
      - ./mysql-dump:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: ecommerce

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

mysql-dump 必须是一个目录。将导入目录中的所有 .sql。

我遇到了与 mysql 类似的问题,我会在 /configs/mysql/data 挂载一个包含 mydatabasedump.sql 文件的本地目录,通过 docker-compose 到 docker-entrypoint-initdb.d卷, 该文件将加载到容器中,但不会在容器初始化时执行或填充数据库。我最初的 docker-compose.yml 看起来像这样:

#docker-compose.yml
version: '3'
services:
    db:
        build: ./build/mysql/ #this is pointing to my Dockerfile
        container_name: MYSQL_Database
        restart: always
        environment:
        MYSQL_PORT: 3306
        MYSQL_ROOT_PASSWORD: admin
        MYSQL_DATABASE: my_app_database
        MYSQL_USER: admin
        MYSQL_PASSWORD: admin
    volumes:
        - ./configs/mysql/data:/docker-entrypoint-initdb.d:

我找到了解决此问题的两个有效解决方案:

第一个是在我登录 运行 容器并确认 mydatabasedump.sq 文件存在并且在容器的 docker-entrypoint-initdb.d 目录中可执行之后;我创建并添加了 一个 bash 脚本到我的本地 /configs/mysql/data 目录,名为 dump.sh,在容器初始化后执行。它包含一个 mysql 命令,可将 my_database_dump.sql 复制到 my_app_database。 bash 脚本如下所示

    #!/bin/bash
    #dump.sh
    mysql -uadmin -padmin my_app_database < my_database_dump.sql 
    #end of dump.sh

我在 ENTRYPOINT 指令中通过我的 Dockerfile 执行了这个脚本,如下所示:

    #Dockerfile
    FROM mysql:5.5
    ENTRYPOINT [ "dump.sh" ]
    EXPOSE 80
    #end of Dockerfile

在意识到最初的问题是由于构建 cotainer 后卷被 mouted 并且因此在启动时没有使用转储文件(或执行该目录中的任何脚本)来整合数据库之后,第二个解决方案很简单到 将我的 compose-file 中的 volumes 指令移到内置指令上方。这有效并允许我删除 Dockerfile 中的 dump.sh 脚本和 DOCKERENTRY 指令。 修改后的 docker-compose.yml 看起来像这样

#docker-compose.yml
version: '3'
services:
    db:
        volumes:
          - ./configs/mysql/data:/docker-entrypoint-initdb.d
       build: ./build/mysql/ #this is pointing to my Dockerfile
         container_name: MYSQL_Database
         restart: always
     environment:
         MYSQL_PORT: 3306
         MYSQL_ROOT_PASSWORD: admin
         MYSQL_DATABASE: my_app_database
         MYSQL_USER: admin
         MYSQL_PASSWORD: admin

我也有这个问题。我在 ./mysql-dump 上安装了一个本地目录,其中包含一个 init.sql 文件,通过 docker-compose 到 docker-entrypoint-initdb.d 卷,该文件会加载到容器中,但不会在容器初始化时执行或填充数据库。 我最初的 docker-compose.yml 看起来像这样:

mysqld:
    image: mysql
    container_name: mysqld
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/my.cnf
      - ./init:/docker-entrypoint-initdb.d
    env_file: .env
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=fendou
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 
             --default-authentication-plugin=mysql_native_password

但这对我不起作用。 我为这个问题找到了另一个可行的解决方案: 添加 --init-file /data/application/init.sql 到 mysql command.change 以上配置 like

mysqld:
    image: mysql
    container_name: mysqld
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/my.cnf
      # - ./init:/docker-entrypoint-initdb.d
    env_file: .env
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=fendou
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 
             --default-authentication-plugin=mysql_native_password
             --init-file /docker-entrypoint-initdb.d/init.sql  #attention here

希望对你有所帮助