Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker运行命令-为什么;docker run<;图像ID>;回声&x27;foo'&引用;工作,但是/bin/sh-c echo';foo';不';T它们应该是等价的_Docker - Fatal编程技术网

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将把该命令解析为四个单词,并且(如果图像声明了入口点),将使用这四个单词作为参数调用入口点。