Docker撰写:MariaDB在init.sql /入口点出错

时间:2020-06-13 18:38:02

标签: docker-compose mariadb

在我的docker compose文件中具有以下服务:

  database:
    image: mariadb
    container_name: database
    environment:
      MYSQL_ROOT_PASSWORD: 7ctDGg5YUwkCPkCW
    entrypoint:
      sh -c "echo 'CREATE DATABASE IF NOT EXISTS users;
                    CREATE DATABASE IF NOT EXISTS data;
                    CREATE DATABASE IF NOT EXISTS wordpress;
                    CREATE USER IF NOT EXISTS 'keycloak'@localhost IDENTIFIED BY 'jk2zKvGkJXBsrNMV';
                    GRANT ALL PRIVILEGES ON 'users'.* TO 'keycloak'@localhost; 
                    CREATE USER IF NOT EXISTS 'wordpress'@localhost IDENTIFIED BY 'QKJFUfZbv7jMB5ba';
                    GRANT ALL PRIVILEGES ON 'wordpress'.* TO 'wordpress'@localhost;' > /docker-entrypoint-initdb.d/init.sql;
      /usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
      "
    ports:
      - 3306:3306
    volumes:
      - database_data:/var/lib/mysql
    networks:
      - backend-network

mariadb服务启动没有问题,但是当它试图运行init.sql时,我收到以下错误消息:

database     | 2020-06-13 18:20:03+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
database     | ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'jk2zKvGkJXBsrNMV' at line 1
database exited with code 1

希望那里有人可以告诉我出什么问题了。

到目前为止, 丹尼尔

1 个答案:

答案 0 :(得分:1)

获取echo语句的内容并将其移动到单独的文件中;例如,当前目录中的init.sql。您可以将该特定文件绑定安装到/docker-entrypoint-initdb.d目录中:

database:
  image: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: 7ctDGg5YUwkCPkCW
  ports:
    - 3306:3306
  volumes:
    - database_data:/var/lib/mysql
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql

所显示的命令实际上发生的是,您将单引号用作外壳程序引号分隔符和SQL引号分隔符。

echo '...IDENTIFIED BY 'something';'

在这种情况下,密码周围的单引号结束了shell引号,并迷路了

# same as:
echo ...IDENTIFIED\ BY\ something\;

如果确实需要这种方式,则可以使用命令的列表格式来专门拼写单词(无需单独引用它们),然后使用YAML块标量语法来避免单独引用命令,此时您可以使用双引号将echo参数括起来

command:
  - sh
  - -c
  - >-
      echo "... IDENTIFIED BY 'password'; ..."...

但是将其拆分成一个单独的文件将更易于理解,并且不那么脆弱。避免在YAML文件中内联编写复杂的脚本。