在 CMD Dockerfile 中转义命令

Escaping command in CMD Dockerfile

要执行 sbt 以执行我使用的特定 Main 方法:

 sbt "run-main tickdata.Main"

如何在 docker 中使用命令 sbt "run-main tickdata.Main"

我试过添加到 Dockerfile :

CMD ["sbt" , "\"run-main tickdata.Main\""]

但是收到错误:

[error] Expected letter
[error] Expected symbol
[error] Expected '!'
[error] Expected '+'
[error] Expected '++'
[error] Expected '^'
[error] Expected '^^'
[error] Expected 'debug'
[error] Expected 'info'
[error] Expected 'warn'
[error] Expected 'error'
[error] Expected ';'
[error] Expected end of input.
[error] Expected 'early('
[error] Expected '-'
[error] Expected '--'
[error] Expected 'show'
[error] Expected 'all'
[error] Expected '*'
[error] Expected '{'
[error] Expected project ID
[error] Expected configuration
[error] Expected key
[error] "run-main tickdata.Main"
[error] ^

你不应该添加 " 和转义它们。

" 中的环绕文本用于确保当使用空格分隔它们时它将作为一个参数而不是多个参数传递,但是如果您将参数(和程序)作为 Strings 用逗号分隔,您不必转义它们。

sbt 期望 run-main tickdata.Main 作为一个参数 - 在 shell 中它必须通过 "run-main tickdata.Main" 完成以确保 shell 将通过 run-main tickdata.Main作为单个参数(不带引号!)。 Docker 也删除了这些引号,所以如果你添加你自己并转义它们然后 sbt 收到命令 "run-main tickdata.Main" 而不是 run-main tickdata.Main 并且它不知道如何解析它。

就这样

CMD ["sbt" , "run-main tickdata.Main"]

是否有道理,见@LuisMiguelMejíaSuárez评论