为什么此入口点在运行jar时使用sh?ENTRYPOINT ["sh", "-c", "java -jar app.jar"]
。仅使用它有什么区别ENTRYPOINT ["java", "-jar", "app.jar"]
?
该ENTRYPOINT
指令(连同CMD
和RUN
)有两种形式。如果您使用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将把和组合成一个命令ENTRYPOINT
CMD
。这可能会导致一个“容器为命令”模式,但你必须使用的JSON阵列形式ENTRYPOINT
,并不得有sh -c
包装。
ENTRYPOINT ["java", "-jar", "app.jar"]
CMD ["-a", "-b", "-c"]
(还要记住,CMD
在docker run
命令中重写它要容易得多,并且有一种有用的模式,ENTRYPOINT
用作包装脚本来进行首次设置,然后执行CMD
as作为主要的容器过程。对于您所显示的简单命令,您可能会发现喜欢CMD
。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句