我想用它来创建数据库并在docker-compose up -d上初始化用户
entrypoint:
sh -c "
echo 'CREATE DATABASE IF NOT EXISTS firstDB;CREATE DATABASE IF NOT EXISTS secondDB;' > /docker-entrypoint-initdb.d/init.sql;
/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
"
效果很好,但这是问题所在
sh -c "echo 'CREATE DATABASE IF NOT EXISTS firstDB;CREATE DATABASE IF NOT EXISTS secondDB;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;' > /docker-entrypoint-initdb.d/init.sql;
/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
"
我试图用'或\'转义'...。没有任何作用。
任何帮助请如何逃脱'?
谢谢
答案 0 :(得分:1)
对于此用例,您不需要。创建一个包含该字符串的本地文件init.sql
;因为它只是一个文件,所以您根本不需要进行任何外壳转义。使用volumes:
声明将文件安装到容器中,并使用图像的默认入口点。例如:
version: '3'
services:
mysql:
image: 'mysql:8'
volumes:
- 'mysql:/var/lib/mysql'
- './init.sql:/docker-entrypoint-initdb.d/init.sql' # <-- this
ports:
- '5432:5432'
volumes:
mysql:
如果有多个文件,则可以将它们放在共享目录中,然后将整个目录装入容器中。如果您需要特殊的显示选项,可以将这些选项(仅)作为command:
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
如果您确实需要以复杂的脚本形式执行此操作,建议您将其编写到Shell脚本中,而不要尝试内联;它节省了一级报价,您可以使用heredocs之类的外壳功能来进一步简化此操作。我可能会将其构建到自定义映像中,但是您可以按照与上述相同的方式将其安装到容器中。
如果所有其他命令均失败,则可以尝试在本地Shell中运行命令,但将echo
放在其前面,或从sh -c
包装器中删除第二个命令。在Shell完成所有引用和其他扩展之后,这将打印出命令行,因此您将更清楚地了解所写内容。
echo sh -c "echo 'CREATE DATABASE ...'"
((如果您需要在带引号的字符串内的带引号的字符串内写出文字引号,这很讨厌。我可能尝试的一种变体是将echo
参数用双引号引起来,因为它们需要转义)在双引号字符串内
sh -c "echo \"CREATE ... 'root'%'@' ...\" > /docker-entrypoint-initdb.d/init.sql"
答案 1 :(得分:0)
嗯,我有点困惑
db:
image: mysql:latest
container_name: mysql
restart: always
networks:
my-container-net:
ipv4_address: 172.16.30.10
ports:
- 60000:3306
command : --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: pass
volumes:
- ./mysql:/var/lib/mysql
entrypoint:
sh -c "echo \"CREATE DATABASE IF NOT EXISTS spotweb;CREATE DATABASE IF NOT EXISTS nextcloud;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;CREATE DATABASE IF NOT EXISTS spotweb;CREATE DATABASE IF NOT EXISTS nextcloud;CREATE USER IF NOT EXISTS 'spotweb'@'localhost' identified with mysql_native_password by 'spotpass';CREATE USER IF NOT EXISTS 'spotweb'@'%' identified with mysql_native_password by 'spotpass';CREATE USER IF NOT EXISTS 'nextcloud'@'localhost' IDENTIFIED BY 'nextpass';CREATE USER IF NOT EXISTS 'nextcloud'@'%' IDENTIFIED BY 'nextpass';GRANT ALL PRIVILEGES ON spotweb.* TO 'spotweb'@'localhost';GRANT ALL PRIVILEGES ON spotweb.* TO 'spotweb'@'%';GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'%';FLUSH PRIVILEGES;\" > /docker-entrypoint-initdb.d/init.sql;/usr/local/bin/docker-entrypoint.sh --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci"
mySQL Server启动,但是没有创建用户或数据库:-(