Docker/SBT 中的 Cmd 和 ExecCmd 有什么区别?

问题描述 投票:0回答:1

sbt-native-packager Docker插件中,这些指令有什么区别? 我们如何将 Cmd/ExecCmd 与 RUN/ENTRYPOINT/CMD 结合起来?

例如,我正在尝试将 git 添加到我的 docker 镜像中。以下错误:

ExecCmd("RUN", "yum install git")

但是

Cmd("RUN", "yum install git")
有效。

docker sbt sbt-native-packager
1个回答
0
投票

RUN
CMD
ENTRYPOINT
在标准 Dockerfile 中有两种语法,

RUN echo shell format automatically wrapped in /bin/sh -c
RUN ["echo", "exec", "format", "with", "JSON", "syntax"]

这些大致分别对应于

Cmd()
ExecCmd()
。 看看这些命令在 dockerfile.scala 中是如何翻译的,
Cmd()
是单词之间用空格分隔的任何内容,
ExecCmd()
是专门的 JSON 数组语法。

dockerCommands := Seq(
  Cmd("FROM", "centos"),
  Cmd("RUN", "yum install git"),
  Cmd("RUN", "yum", "install", "git"),
  ExecCmd("RUN", "yum", "install", "git")
)

前两行

Cmd("RUN", ...)
实际上会生成相同的内容,因为
Cmd()
只是用空格连接其参数,但将第二行与
ExecCmd("RUN", ...)
进行比较会提供丰富的信息。 与使用 Dockerfile exec(JSON 数组)语法的其他情况一样,您需要确保将命令拆分为单独的单词。

CMD
ENTRYPOINT
而言,您将使用通常在 Dockerfile 中使用的相同规则。
ENTRYPOINT
除了必须使用
ExecCmd()
,否则容器运行时会丢失命令部分,
CMD
可以使用任一语法,如果有shell语法则必须使用
Cmd()

dockerCommands ++= Seq(
  ExecCmd("ENTRYPOINT", "/app/entrypoint.sh")
  Cmd("CMD", "java $JVM_ARGS -jar app.jar")
)

其他几个 Dockerfile 选项也接受 JSON 数组语法,如果您想强制这样做,可以在此处使用

ExecCmd()

ExecCmd("COPY", "filename with a space.txt", "./")
© www.soinside.com 2019 - 2024. All rights reserved.