Docker Run 命令 - 为什么"docker run <image ID> echo 'foo'"工作,但 /bin/sh -c 回显'foo'不起作用?它们应该是等效的



默认入口点为/bin/sh -c,我希望在不打印foo的/bin/sh -c echo 'foo'执行中看到docker run <image ID> echo 'foo'结果(foo在这里是sh的arg,而不是echo(。

然而,它似乎是作为一个单独的arg传入sh的。这是什么原因?

我能想到的唯一原因是docker运行的命令被解析为单个命令,并作为单个项目交给/bin/sh -c

sh -c选项采用单个参数,该参数将作为shell命令进行解析和执行。如果该命令有多个单词,则需要引用它,以便将其作为单个参数传递。

这不是Docker特有的,你可以在本地shell中看到它:

$ echo 'foo'
foo
$ /bin/sh -c echo 'foo'
$ /bin/sh -c "echo 'foo'"
foo

如果有其他参数,sh -c命令可以将它们视为位置参数,从$0开始。

$ sh -c 'echo "$2"' foo bar baz quux
baz

在更特定于Docker的上下文中,您可以将其用作docker run命令来看到相同的行为

$ docker run --rm busybox sh -c 'echo "$2"' foo bar baz
baz

在Dockerfile中,RUN、CMD和ENTRYPOINT将自动添加sh -c包装,因此您不需要显式指定它

# same:
CMD ls && exec main_program
CMD ["/bin/sh", "-c", "ls && exec main_program"]
# unnecessary extra sh -c:
CMD sh -c 'ls && exec main_program'
CMD ["/bin/sh", "-c", "main_program"] # without redirects, environment variables, ...

如果有一个复杂的命令作为docker run或Composecommand:覆盖命令,则只需要显式sh -c

相关内容

最新更新