首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Docker Run命令-为什么"docker run <image ID> echo 'foo'“有效,但/bin/sh -c echo 'foo‘不行?它们应该是等价的

Docker Run命令是用于在Docker容器中运行一个命令或应用程序。在给定的问答内容中,"docker run <image ID> echo 'foo'"是有效的,而"/bin/sh -c echo 'foo'"则不行。下面我将解释为什么会出现这种情况。

首先,让我们了解一下Docker Run命令的基本语法。Docker Run命令的一般形式是:

代码语言:txt
复制
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

其中,OPTIONS是一些可选的参数,IMAGE是要运行的Docker镜像,COMMAND是要在容器中执行的命令,ARG是传递给命令的参数。

在给定的例子中,"docker run <image ID> echo 'foo'"中的COMMAND是"echo 'foo'",它会在容器中执行echo命令并输出'foo'。这是有效的,因为Docker会将COMMAND参数解释为一个完整的命令,并在容器中执行它。

而"/bin/sh -c echo 'foo'"中的COMMAND是"/bin/sh -c echo 'foo'",它会在容器中执行/bin/sh命令,并将"-c echo 'foo'"作为参数传递给/bin/sh。这种情况下,Docker会将COMMAND参数解释为一个包含多个子命令的字符串。然而,由于/bin/sh命令不支持直接执行echo命令,所以会导致执行失败。

为了解决这个问题,可以使用以下两种方法之一:

  1. 使用单引号或双引号将整个命令包裹起来,以确保COMMAND参数被解释为一个完整的命令。例如:
代码语言:txt
复制
docker run <image ID> /bin/sh -c "echo 'foo'"
  1. 直接使用Docker提供的特殊命令形式,以确保COMMAND参数被正确解释。例如:
代码语言:txt
复制
docker run <image ID> --entrypoint echo 'foo'

以上两种方法都可以使"/bin/sh -c echo 'foo'"在Docker容器中执行成功。

总结起来,"docker run <image ID> echo 'foo'"和"/bin/sh -c echo 'foo'"之间的区别在于COMMAND参数的解释方式。前者将COMMAND参数解释为一个完整的命令,而后者将COMMAND参数解释为一个包含多个子命令的字符串。这就是为什么前者有效而后者不行的原因。

对于Docker Run命令的更多详细信息,以及腾讯云相关产品和产品介绍链接地址,您可以参考腾讯云的官方文档:Docker Run命令

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Docker学习笔记---Dockerfile

bin/sh RUN [“executable”, “param1”, “param2”] 该RUN指令在当前镜像顶部新层中执行任何命令,病提交结果,结果提交图像当被用户下一步Dockerfile...docker RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' ``` >注:如果你想使用其他shell比如**bash**,请使用在所需shell...传递参数,**RUN ["/bin/bash", "-c", "echo hello"]** ### apt-get 如果你基础镜像使用是**Debian**,那你一定会经常使用**apt-get...可以指定多个资源,如果它们是文件或目录,则它们必须相对于正在构建源目录(构建上下文)。 每个可能包含通配符,并使用Gofilepath.Match规则进行匹配 。...ENTRYPOINT例子 您可以指定一个纯粹字符串,ENTRYPOINT并在其中执行/bin/sh -c

67110

Dockerfile文件编写官方文档 原

第一种形式: RUN (以shell形式执行命令,等同于 /bin/sh -c); 第二种形式: RUN ["executable", "param1", "param2"](等同于exec...RUN /bin/bash -c 'source $HOME/.bashrc ;\ echo $HOME' 等同于 RUN /bin/bash -c 'source $HOME/.bashrc ; echo...例如下面将启动nginx作为运行容器默认内容,监听80端口: docker run -i -t --rm -p 80:80 nginx docker run 命令行参数会在 exec格式...shell形式指令避免任何 CMD或者 run使用命令行参数,但是缺点是 ENTRYPOINT指令会作为/bin/sh -c进程子进程来运行,这意味着无法收到容器中来自 PID 1UNIX信号,所以进程将无法通过...不过我们可以执行这个命令来执行shell命令`ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ]` 。

95330

Dockerfile、Docker-Compose基本命令与介绍

指定使用其它终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”,”echo hello”] 。每条RUN指令将在当前镜像基础上执行指定命令,并提交为新镜像。...exec 方式不会调用一个命令 shell,所以也就不会继承相应变量,如: RUN [ "echo", "$HOME" ] 这种方式是不会达到输出 HOME 变量,正确方式应该是这样 RUN [..."sh", "-c", "echo", "$HOME" ] RUN产生缓存在下一次构建时候是不会失效,会被重用,可以使用--no-cache选项,即docker build --no-cache...启动容器并启动bash(交互方式): $docker run -i -t /bin/bash 2.保存对容器修改(commit) 当你对某一个容器做了修改之后...echo "Hello world" 当指令执行时,shell 格式底层会调用 /bin/sh -c

1.7K20

Docker系列教程07-Dockerfile指令详解

,都是指定Docker容器启动时执行命令,可多次设置,只有最后一个有效。...示例: # 声明暴露一个端口示例 EXPOSE port1 # 相应运行容器使用命令 docker run -p port1 image # 也可使用-P选项启动 docker run -P image.../bin/sh-c ,在Windows中是 cmd/s/c ,使用这种格式,就像直接在命令行中输入命令一样。...指定其他终端可以通过该方式操作,例如: RUN["/bin/bash","-c","echo hello"] ,该方式必须使用双引号["]而不能使用单引号['],因为该方式会被转换成一个JSON 数组。...如果另一个容器也有持久化需求,并且想使用以上容器/tmp目录中内容,则可使用如下命令启动容器: docker run -volume-from 容器ID 镜像名称 # 容器ID是di一个容器ID

88170
领券