在我的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
希望那里有人可以告诉我出什么问题了。
到目前为止, 丹尼尔
答案 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文件中内联编写复杂的脚本。