繁体   English   中英

Docker 撰写 mysql 进口.sql

[英]Docker Compose mysql import .sql

我在使用 docker-compose 导入 .sql 转储文件时遇到问题。我已经按照文档进行操作,显然将从 docker-entrypoint-initdb.d 加载 .sql 文件。 但是,当我运行docker-compose up ,sql 文件不会复制到容器中。

我试过使用-vf标志停止容器,但这也没有用。 我在 my.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

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

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

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

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

初始化一个新实例

首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。 此外,它将执行扩展名为.sh.sql.sql.gz文件,这些文件位于/docker-entrypoint-initdb.d中。 文件将按字母顺序执行。 您可以通过将SQL转储装入该目录并使用提供的数据提供自定义映像来轻松填充您的mysql服务。 默认情况下,SQL文件将导入到MYSQL_DATABASE变量指定的数据库中。

这对我有用,

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数据库转储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}

我也有这个问题。 我通过 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

希望对你有帮助

我有一个与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目录中可执行之后。 我创建并在我的local / configs / mysql / data目录中添加了一个bash脚本,该目录名为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 Dokerfile

在意识到最初的问题是由于在构建cotainer之后对卷进行了调整,因此在启动时没有使用转储文件(或在该目录中执行任何脚本)来使用数据库,第二个解决方案只是移动卷指令在构建指令上面的compose文件中。 这工作,并允许我删除我的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

我想保留容器的原始设置,所以我尝试在已经运行的容器上进行恢复。 这似乎有效:

cat dump.sql | docker-compose exec -T db mysql -h localhost -u root -psomewordpress -v

但它非常慢,冗长的 output 似乎被缓冲了,所以我尝试了:

docker-compose cp dump.sql db:/tmp/
docker-compose exec db sh -c "mysql -h localhost -u root -psomewordpress -v < /tmp/dump.sql"

这至少提供了更快的反馈。

可能对某人有用? 看起来它很慢,因为我在转储上使用了--skip-extended-insert ,没有扩展插入它运行得更快

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM