为什么Docker中的入口点以运行jar的sh开头?

邓肯·奥利奥

为什么此入口点在运行jar时使用sh?ENTRYPOINT ["sh", "-c", "java -jar app.jar"]仅使用它有什么区别ENTRYPOINT ["java", "-jar", "app.jar"]

大卫·迷兹

ENTRYPOINT指令(连同CMDRUN)有两种形式。如果您使用JSON-array语法,则不会进行解释,单词拆分或任何其他处理。您传递的正是运行的内容。

# Three words
ENTRYPOINT ["java", "-jar", "app.jar"]
# You're already quoting things so spaces stay as part of each word
ENTRYPOINT ["java", "-jar", "my app.jar"]
# There is no interpolation so variable names do not get expanded --
# this looks for a file literally named `$JARFILE`
ENTRYPOINT ["java", "-jar", "$JARFILE"]
# There is only one command-line option with embedded spaces
ENTRYPOINT ["java", "-jar", "app.jar", "-a -b -c"]

在某些情况下(尤其是变量扩展),您确实需要运行shell。这就是sh -c进来,它需要一个单一的字,并处理它作为外壳命令。然后,它(大部分)会忽略所有其他选项,这意味着会CMD被有效忽略。

# This expands the environment variable `$JARFILE`, but if
# you pass additional options in `CMD`, they're lost
ENTRYPOINT ["sh", "-c", "java -jar $JARFILE"]

但是,您实际上不应使用此语法,因为Docker提供了自动为您插入纯字符串语法sh -c

# Exactly the same as above
ENTRYPOINT java -jar $JARFILE
# Three additional command-line options, since the shell does splitting
ENTRYPOINT java -jar app.jar -a -b -c

请记住,Docker将把组合成一个命令ENTRYPOINTCMD这可能会导致一个“容器为命令”模式,但你必须使用的JSON阵列形式ENTRYPOINT,并不得sh -c包装。

ENTRYPOINT ["java", "-jar", "app.jar"]
CMD ["-a", "-b", "-c"]

(还要记住,CMDdocker run命令中重写它要容易得多,并且有一种有用的模式,ENTRYPOINT用作包装脚本来进行首次设置,然后执行CMDas作为主要的容器过程。对于您所显示的简单命令,您可能会发现喜欢CMD。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章