微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Docker撰写:MySQL语法错误“DELIMITER”在第1行

我有问题,我希望Docker Compose在设置MySQL后直接导入我的Database.sql文件.但它总是抛出我的错误

You have an error in your sql Syntax; check the manual that corresponds to your MysqL server version for the right Syntax to use near ‘DELIMITER |’ at line 1

但不知何故,当我通过浏览器中的PHPMyAdmin导入它时,它的工作原理非常好.

这是我的docker-compose.yml:

version: "3.2"
services:
  PHP:
    build: './PHP/'
    networks:
      - backend
    volumes:
      - ./www/:/var/www/html/
  apache:
    build: './apache/'
    depends_on:
      - PHP
      - MysqL
    networks:
      - frontend
      - backend
    ports:
      - "8081:80"
    volumes:
      - ./www/:/var/www/html/
  MysqL:
    image: MysqL:5.7
    volumes:
      - ./MysqL:/tmp/database
    command: MysqLd --max_allowed_packet=32505856 --user=root --init-file="/tmp/database/schema.sql"
    networks:
      - backend
    environment:
      - MysqL_ROOT_PASSWORD=root
  PHPmyadmin:
    image: PHPmyadmin/PHPmyadmin
    links:
        - MysqL
    ports:
      - '8082:80'
    environment:
      MysqL_USERNAME: root
      MysqL_ROOT_PASSWORD: root
      PMA_HOST: MysqL
    networks:
      - backend
networks:
  frontend:
  backend:

这是我的.sql文件一个示例片段,它被执行:

-- PHPMyAdmin sql Dump
-- version 4.8.2
-- https://www.PHPmyadmin.net/
--
-- Host: MysqL
-- Generation Time: Aug 20, 2018 at 08:30 AM
-- Server version: 5.7.23
-- PHP Version: 7.2.6
DELIMITER $$

SET sql_mode = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

--
-- Database: `database`
--
CREATE DATABASE IF NOT EXISTS `databasetest` DEFAULT CHaraCTER SET latin1 COLLATE latin1_swedish_ci;
USE `databasetest`;

--
-- Procedures
--
DROP PROCEDURE IF EXISTS `sp_filestatus_get`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_filestatus_get` (IN `filename_name` VARCHAR(500), IN `kampagne_name` VARCHAR(100), IN `outlet_name` VARCHAR(100))  NO sql

... Some more stuff

END;

我错过了配置中的一些内容吗?或者为什么它不能与compose一起工作但直接在PHPMyAdmin中有效?

解决方法:

如果您确实需要DELIMITER语句,可以将MysqL的命令更改为

bash -c“service MysqL start&& echo’xxxxxxxxxxxxxxxxxx’&& MysqL –max_allowed_pa​​cket = 32505856 -u root -proot< /tmp/database/schema.sql\u0026 amp ;> while true; do sleep 1完成

然后它应该没有任何其他变化.

所以你的MysqL-section应该是这样的:

  MysqL:
    image: MysqL:5.7
    volumes:
      - ./MysqL:/tmp/database
    command: bash -c "service MysqL start && echo 'xxxxxxxxxxxxxxxxx' && MysqL --max_allowed_packet=32505856 -u root -proot < /tmp/database/schema.sql && while true; do sleep 1; done"
    networks:
      - backend
    environment:
      - MysqL_ROOT_PASSWORD=root

解释原因:

之前,您使用MysqLd命令启动MysqL-server并指定init-script.现在它作为一项服务启动.这带来了一个优点和一个缺点.

>优点:您现在可以使用MySQL命令连接到您的MysqL-server.
>缺点:在指定MySQL命令后,docker将停止容器.

为了处理这个缺点,我添加了true;做睡觉1;完成为最后一个命令.这会导致容器运行直到它停止.回声仅供您查看命令执行.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐