在sbt-native-packager Docker插件中,这些指令有什么区别? 我们如何将 Cmd/ExecCmd 与 RUN/ENTRYPOINT/CMD 结合起来?
例如,我正在尝试将 git 添加到我的 docker 镜像中。以下错误:
ExecCmd("RUN", "yum install git")
但是
Cmd("RUN", "yum install git")
有效。
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", "./")