如何在docker-compose入口点中转义'

时间:2019-12-27 16:16:47

标签: docker docker-compose

我想用它来创建数据库并在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
  "

我试图用'或\'转义'...。没有任何作用。

任何帮助请如何逃脱'?

谢谢

2 个答案:

答案 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启动,但是没有创建用户或数据库:-(