CMD Dockerfile 中的转义命令

Posted

技术标签:

【中文标题】CMD Dockerfile 中的转义命令【英文标题】:Escaping command in CMD Dockerfile 【发布时间】:2021-04-07 00:44:24 【问题描述】:

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

 sbt "run-main tickdata.Main"

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

我已经尝试添加到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] ^

【问题讨论】:

如果您只使用CMD ["sbt" , "run-main tickdata.Main"] 会发生什么? - 另外,请注意,在 docker 图像中包含整个 sbt 项目的情况并不常见。您通常使用较小的普通 java 应用程序 (只是 JRE) 创建一个 docker 映像。更快更简单。如果项目不太复杂,您可以使用 sbt-assembly 生成单个 jar 并在 CMD 上执行 java -jar jar,或者您可以查看 sbt-native-packager 创建更强大的 docker 映像。 【参考方案1】:

您不应该添加 " 并转义它们。

" 中包装文本用于确保当使用空格分隔它们时它将作为一个参数而不是多个参数传递,但如果您将参数(和程序)作为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 评论。

【讨论】:

以上是关于CMD Dockerfile 中的转义命令的主要内容,如果未能解决你的问题,请参考以下文章

docke--Dockerfile构建docker镜像

CMD命令中的参数带有双引号,如何转义双引号?

使用 docker run 命令将参数传递给 Dockerfile 中的 CMD

Dockerfile 中的 CMD 与 ENTRYPOINT

CMD命令中的参数带有双引号,如何转义双引号?

Docke部署springboot jar包项目