Docker撰写mysql import .sql

时间:2016-04-14 08:32:14

标签: mysql docker docker-compose

我在使用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

6 个答案:

答案 0 :(得分:21)

经过多次尝试卷设置后,我找到了解决方法

我在Dockerfile中使用以下内容创建了另一个基于mysql的图像

FROM mysql:5.6

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

然后从撰写中删除卷并运行新图像

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

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

答案 1 :(得分:10)

这显示在Docker MySQL图像的文档页面上:https://hub.docker.com/_/mysql/

  

初始化新实例

     

第一次启动容器时,使用新的数据库   将使用提供的名称创建和初始化指定的名称   配置变量。此外,它将执行文件   在其中找到的扩展程序.sh.sql.sql.gz   /docker-entrypoint-initdb.d。文件将按字母顺序执行   订购。您可以通过mounting a SQL dump into that directory轻松填充您的mysql服务   并提供custom images贡献   数据。默认情况下,SQL文件将导入指定的数据库   通过MYSQL_DATABASE变量。

答案 2 :(得分:7)

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

搬运工-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}

答案 3 :(得分:6)

这对我有用,

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文件都将导入。

答案 4 :(得分:1)

我也有这个问题。我在 ./mysql-dump 中通过 docker-compose 将包含 init.sql 文件的本地目录挂载到 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 以上配置如

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

希望对你有帮助

答案 5 :(得分:0)

我在使用mysql时遇到类似的问题,我会通过docker-compose将包含mydatabasedump.sql文件的本地目录挂载在/ configs / mysql / data上,并放置到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

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

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

意识到最初的问题是由于在构建容器之后就将卷转移了,因此没有在启动时将数据库与转储文件一起使用(或在该目录中执行任何脚本),第二种解决方案是 将volumes指令在我的compose文件中移动到build指令上方。这有效并且允许我删除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