Docker编写MySQL导入.sql文件

ryoqjall  于 2022-12-10  发布在  Mysql
关注(0)|答案(7)|浏览(259)

我在使用docker-compose导入.sql转储文件时遇到问题。我遵循了文档,它显然将从docker-入口点-initdb.d加载.sql文件。但是,当我运行docker-compose up时,SQL文件不会复制到容器中。
我尝试使用-vf标志停止容器,但也不起作用。我是不是在.yml脚本中做错了什么?
我在我的合成文件所在的根目录下的数据库/db-ump/目录中有dup.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
z31licg0

z31licg01#

这对我很管用,

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

rm5edbpk

rm5edbpk2#

在多次尝试音量设置后,我找到了一种解决方法
我创建了另一个基于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

这样,转储文件始终被复制并在启动时运行

ac1kyiln

ac1kyiln3#

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

初始化新示例

容器第一次启动时,会创建一个指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它还将执行扩展名为.sh.sql.sql.gz的文件,这些文件位于/docker-entrypoint-initdb.d中。文件将按字母顺序执行。通过将SQL转储挂载到该目录并为custom images提供贡献的数据,您可以轻松地填充MySQL服务。默认情况下,SQL文件将导入到由MYSQL_DATABASE变量指定的数据库。

ckx4rj1h

ckx4rj1h4#

MySQL数据库转储schema.sql驻留在**/mysql-ump/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}
hs1rzwqc

hs1rzwqc5#

我在使用MySQL时遇到了类似的问题,我将通过docker-compose将一个本地目录挂载到/configs/mysql/data,其中包含一个mydatabase asedump.sql文件到docker-entry-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:

我为这个问题找到了两个可行的解决方案:
第一次是在我登录正在运行的容器并确认mydatabase asedump.sq文件存在并且在容器的docker-entry-initdb.d目录中可执行之后;我创建了一个bash脚本,并将其添加到我的本地/configs/mysql/data目录中,该目录在容器初始化后执行,名为ump.sh。它包含一个MySQL命令,该命令将my_database_ump.sql复制到my_app_database。Bash脚本如下所示

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

我通过入口点指令中的Dockerfile执行此脚本,如下所示:

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

在意识到最初的问题是由于在构建容器之后装入卷,因此在引导时没有使用转储文件的数据库(或执行该目录中的任何脚本)之后,第二个解决方案简单地将我的组成文件中的VOLUES指令移到了BUILD指令之上。这起作用了,并允许我删除Dockerfile中的dup.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
rsaldnfx

rsaldnfx6#

我也有这个问题。我通过docker-compose将包含init.sql文件的本地目录挂载到./mysql上,将该文件加载到容器上,但不会在容器初始化时执行或填充数据库。我最初的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命令中。

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

希望能对你有所帮助

zmeyuzjn

zmeyuzjn7#

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

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

但它非常慢,冗长的输出似乎得到了缓冲,所以我尝试了:

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,在没有扩展插入的情况下,它运行得更快🙂

相关问题