【问题标题】:Docker-compose mysql mount volume turns sql into folderDocker-compose mysql mount volume 将 sql 变成文件夹
【发布时间】:2018-10-24 04:53:48
【问题描述】:

我正在尝试使用 Docker 创建一组容器(wordpress 和 MySQL),这将有助于我使用 Wordpress 进行本地开发。当我们运行一个实时数据库时,我想将一个 dump.sql 文件挂载到 Docker mysql 容器中。下面是我的 .yml 文件。

version: '2' 

services: 
  db: 
    image: mysql:latest 
    volumes: 
      - ./data:/docker-entrypoint-initdb.d #./data holders my dump.sql file
    environment: 
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress: 
    depends_on: 
      - db
    image: wordpress:latest 
    ports:
      - "8000:80" 
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress 
    volumes: 
      - ./wp-content/themes/portalV3:/var/www/html/wp-content/themes/portalV3 
      - ./wp-content/plugins:/var/www/html/wp-content/plugins 
      - ./wp-content/uploads:/var/www/html/wp-content/uploads 

一切正常,但大约 10 秒后,mysql 的 docker 容器崩溃。通过日志,我收到以下错误:

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/dump.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR: Can't initialize batch_readline - may be the input source is a directory or a block device.

仔细检查(附加到重新启动的 mysql 容器),我发现我的 dump.sql 文件确实没有转移到容器中,但是在 /docker-entrypoint-initdb.d 中创建了一个同名的文件夹。

谁能帮助我了解如何让 docker-compose 复制我的 dump.sql 文件并导入数据库?

干杯,

彼得

【问题讨论】:

    标签: mysql wordpress docker docker-compose


    【解决方案1】:

    docker-entrypoint-initdb.d 的问题在于,由于源“数据”是目录而不是文件,因此目标文件 (docker-entrypoint-initdb.d) 也必须是目录。反之亦然。

    所以要么做

    volumes: 
       - ./data:/docker-entrypoint-initdb.d/
    

    volumes: 
       - ./data/mydump.sql:/docker-entrypoint-initdb.d/mydump.sql
    

    【讨论】:

      【解决方案2】:

      是的,这就是您应该挂载.sql.sh 文件的方式,即通过将SQL 或.sh 文件映射到docker 容器的docker-entrypoint-initdb.d 文件夹来添加卷。但是,由于某些奇怪的原因,它引发了一个错误,可能是因为 MySQL docker 版本太旧。

      您可以通过创建自定义图像来解决此问题,即

      Dockerfile

       FROM mysql:5.7
       COPY init.sql /docker-entrypoint-initdb.d/
      

      它会创建一个映像,并且还有助于在启动容器时运行一个初始化脚本。

      要在 compose 文件中使用它,请将您的 SQL 文件和 Dockerfile 放在一个文件夹中。

      database
        |---init.sql
        |---Dockerfile
      

      docker-compose.yml

       version: '3'
       services:
         mysqldb:
           image: mysqldb
           build: ./database
           container_name: mysql
           ports:
             - "3306:3306"
           environment:
             - MYSQL_ROOT_PASSWORD=root
             - MYSQL_USER=test
             - MYSQL_PASSWORD=root
             - MYSQL_DATABASE=test
      

      这样,您可以轻松配置环境变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-02
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-27
        相关资源
        最近更新 更多