Docker运行命令-为什么;docker run<;图像ID>;回声&x27;foo'&引用;工作,但是/bin/sh-c echo';foo';不';T它们应该是等价的
默认入口点为Docker运行命令-为什么;docker run<;图像ID>;回声&x27;foo'&引用;工作,但是/bin/sh-c echo';foo';不';T它们应该是等价的,docker,Docker,默认入口点为/bin/sh-c,我希望看到docker运行echo'foo'会导致/bin/sh-c echo'foo'执行,而不会打印foo(这里foo是sh的参数,而不是echo) 但是,它似乎是作为一个参数引用/传递给sh的。这是什么原因 我能想到的唯一原因是docker run命令被解析为单个命令,并作为单个项传递给/bin/sh-c,sh-c选项接受单个参数,该参数被解析并作为shell命令执行。如果该命令有多个单词,则需要引用它,以便将其作为单个参数传递 这不是Docker特有的,您
/bin/sh-c
,我希望看到docker运行echo'foo'
会导致/bin/sh-c echo'foo'
执行,而不会打印foo(这里foo是sh的参数,而不是echo)
但是,它似乎是作为一个参数引用/传递给sh的。这是什么原因
我能想到的唯一原因是docker run命令被解析为单个命令,并作为单个项传递给
/bin/sh-c
,sh-c
选项接受单个参数,该参数被解析并作为shell命令执行。如果该命令有多个单词,则需要引用它,以便将其作为单个参数传递
这不是Docker特有的,您可以在本地shell中看到它:
$echo'foo'
福
$/bin/sh-c echo“foo”
$/bin/sh-c“echo'foo'”
福
如果有其他参数,则sh-c
命令可以将它们视为位置参数,从$0
开始
$sh-c'echo“$2”foo-bar-baz-qux
巴兹
在更特定于Docker的上下文中,您可以看到使用此命令作为Docker run
命令的相同行为
$docker run--rm busybox sh-c'echo“$2”foo bar baz
巴兹
在Dockerfile中,RUN、CMD和ENTRYPOINT将自动添加sh-c
包装器,因此无需显式指定它
#相同:
CMD ls&&exec主程序
CMD[“/bin/sh”、“-c”、“ls&&exec主程序”]
#不必要的额外sh-c:
CMD sh-c“ls&&exec主程序”
CMD[“/bin/sh”、“-c”、“main_program”]#不带重定向、环境变量。。。
如果有一个复杂的命令作为
docker run
或Compose命令:
override命令,则只需要显式的sh-c
。sh-c
选项接受一个参数,该参数作为shell命令进行分析和执行。如果该命令有多个单词,则需要引用它,以便将其作为单个参数传递
这不是Docker特有的,您可以在本地shell中看到它:
$echo'foo'
福
$/bin/sh-c echo“foo”
$/bin/sh-c“echo'foo'”
福
如果有其他参数,则sh-c
命令可以将它们视为位置参数,从$0
开始
$sh-c'echo“$2”foo-bar-baz-qux
巴兹
在更特定于Docker的上下文中,您可以看到使用此命令作为Docker run
命令的相同行为
$docker run--rm busybox sh-c'echo“$2”foo bar baz
巴兹
在Dockerfile中,RUN、CMD和ENTRYPOINT将自动添加sh-c
包装器,因此无需显式指定它
#相同:
CMD ls&&exec主程序
CMD[“/bin/sh”、“-c”、“ls&&exec主程序”]
#不必要的额外sh-c:
CMD sh-c“ls&&exec主程序”
CMD[“/bin/sh”、“-c”、“main_program”]#不带重定向、环境变量。。。
如果您有一个复杂的命令作为
docker run
或Compose命令:
override命令,则只需要显式的sh-c
。说默认入口点是/bin/sh-c
并不准确。根据“如果使用CMD的shell形式,那么将在/bin/sh-c中执行”。这意味着CMD
(或您在命令行上传递的任何内容)的整个值作为单个参数提供给sh-c
。您认为Docker歪曲了它所做的事情的假设是完全正确的。但这并不是唯一的原因;大多数ps
实现在打印命令行时都有完全相同的错误。太棒了,这些回答了我的问题。感谢。说默认入口点是/bin/sh-c
并不准确。根据“如果使用CMD的shell形式,那么将在/bin/sh-c中执行”。这意味着CMD
(或您在命令行上传递的任何内容)的整个值作为单个参数提供给sh-c
。您认为Docker歪曲了它所做的事情的假设是完全正确的。但这并不是唯一的原因;大多数ps
实现在打印命令行时都有完全相同的错误。太棒了,这些回答了我的问题。我的问题是关于什么(以及如何)东西被传递到你的入口点。在echo“foo”的示例中,您希望只看到打印的换行符,但是当它被交给docker run命令时,您会看到它作为单个参数传递并打印foo。只是想了解为什么会这样。如果你docker运行/bin/sh-c echo'foo'
,主机的shell将把该命令解析为四个单词,并且(如果图像声明了入口点)将用这四个单词作为参数调用入口点。我的问题是关于将什么(以及如何)东西传递到入口点。在echo“foo”的示例中,您希望只看到打印的换行符,但是当它被交给docker run命令时,您会看到它作为单个参数传递并打印foo。只是想了解为什么会这样。如果你docker运行/bin/sh-c echo'foo'
,主机的shell将把该命令解析为四个单词,并且(如果图像声明了入口点),将使用这四个单词作为参数调用入口点。