Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker Compose mysql import.sql_Mysql_Docker_Docker Compose - Fatal编程技术网

Docker Compose mysql import.sql

Docker Compose mysql import.sql,mysql,docker,docker-compose,Mysql,Docker,Docker Compose,我无法使用docker compose导入.sql转储文件。我遵循了文档,它显然将从docker entrypoint initdb.d加载.sql文件。但是,当我运行docker compose up时,sql文件不会复制到容器中 我尝试过用-vf标志停止容器,但也没有成功。我的.yml脚本是否有问题 我的compose文件所在的根目录database/db dump/中有dump.sql frontend: image: myimage ports: - "80:80" l

我无法使用docker compose导入.sql转储文件。我遵循了文档,它显然将从docker entrypoint initdb.d加载.sql文件。但是,当我运行
docker compose up
时,sql文件不会复制到容器中

我尝试过用
-vf
标志停止容器,但也没有成功。我的.yml脚本是否有问题

我的compose文件所在的根目录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
然后从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映像的文档页面上:

初始化新实例

当容器第一次启动时,一个新的数据库 将创建指定的名称,并使用提供的 配置变量。此外,它将使用 可在中找到的扩展名
.sh
.sql
.sql.gz
/docker入口点initdb.d。文件将按字母顺序执行 秩序。您可以通过以下方式轻松填充mysql服务: 并提供 数据。默认情况下,SQL文件将导入指定的数据库 通过
MYSQL\u数据库
变量


Mysql数据库转储schema.sql位于/Mysql转储/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转储必须是一个目录。目录中的所有.sql都将被导入。

我在mysql中遇到了类似的问题,我将通过docker compose在/configs/mysql/data处装载一个本地目录,其中包含一个mydatabasedump.sql文件,并将其装载到docker入口点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:
    #Dockerfile
    FROM mysql:5.5
    ENTRYPOINT [ "dump.sh" ]
    EXPOSE 80
    #end of Dockerfile
我找到了两种解决此问题的有效方法:

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

    #!/bin/bash
    #dump.sh
    mysql -uadmin -padmin my_app_database < my_database_dump.sql 
    #end of dump.sh
#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
在意识到最初的问题是由于在构建cotainer之后安装了卷,因此在引导时没有使用转储文件初始化数据库(或在该目录中执行任何脚本),第二个解决方案就是 将我的撰写文件中的volumes指令移到Build指令上方。这起了作用,允许我删除Dockerfile中的dump.sh scrip和DOCKERENTRY指令。 修改后的docker-compose.yml如下所示

    #!/bin/bash
    #dump.sh
    mysql -uadmin -padmin my_app_database < my_database_dump.sql 
    #end of dump.sh
#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

我也有这个问题。我通过docker compose将包含init.sql文件的本地目录装载到docker entrypoint initdb.d卷的./mysql dump,该文件将加载到容器中,但在容器初始化时不会执行或填充数据库。 我的初始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:
    #Dockerfile
    FROM mysql:5.5
    ENTRYPOINT [ "dump.sh" ]
    EXPOSE 80
    #end of Dockerfile
mysqld:
图片:mysql
容器名称:mysqld
卷数:
-./mysql/data:/var/lib/mysql
-./mysql/my.cnf:/etc/my.cnf
-./init:/docker入口点initdb.d
环境文件:.env
重新启动:始终
环境:
-MYSQL\u ROOT\u密码=123456
-MYSQL_数据库=fendou
命令:--字符集服务器=utf8mb4--排序规则服务器=utf8mb4\U unicode\U ci
--默认身份验证插件=mysql\u本机\u密码
但这对我不起作用。 我找到了解决这个问题的另一个有效方法: 将
--init file/data/application/init.sql
添加到mysql命令中

mysqld:
图片:mysql
容器名称:mysqld
卷数:
-./mysql/data:/var/lib/mysql
-./mysql/my.cnf:/etc/my.cnf
#-./init:/docker入口点initdb.d
环境文件:.env
重新启动:始终
环境:
-MYSQL\u ROOT\u密码=123456
-MYSQL_数据库=fendou
命令:--字符集服务器=utf8mb4--排序规则服务器=utf8mb4\U unicode\U ci
--默认身份验证插件=mysql\u本机\u密码
--init file/docker-entrypoint-initdb.d/init.sql#注意这里

希望对您有所帮助

您的docker compose正在我的机器上工作。请附上主机上转储位置的目录结构,以及如何检查复制到容器中的文件。目录结构为“数据库>数据库转储>转储.sql”一旦编写完成mysql容器的连接,并检查docker entrypoint initdb.d dir,该dir始终为空/docker entrypoint initdb.d仅在创建容器时读取。OP在运行docker compose up时要求数据库“更新”。你应该看看:等等,没有理由仅仅为了导入一些文件而构建一个新映像:只有在数据永远不变的情况下才有意义,而且你正在将映像共享给同事,所以他们不需要每次都导入该文件。但是在正常情况下,使用卷是可以采用的解决方案。请记住,您的SQL语句可能需要
CREATE DATABASE[name]
USE[name]
语句,您可以确认您的SQL文件将与
docker exec-i[container\u id]sh-c'exec mysql-uroot-p“[password]”一起工作。
,如果它在这里工作,它应该在您的docker文件中工作。谢谢!这对我有帮助,而其他人没有。