Docker:为什么Dockerfile的命令没有被执行?

我有一个关于从Dockerfile执行容器中的命令的查询。

#Dockerfile Content: FROM ubuntu:14.04 MAINTAINER RAGHU RUN echo "hello World" 

build立程序

  docker build -t helloworld . Sending build context to Docker daemon 20.04 MB Step 1 : FROM ubuntu:14.04 ---> b1719e1db756 Step 2 : MAINTAINER RAGHU ---> Using cache ---> 1704b62d66e2 Step 3 : RUN echo "hello World" ---> Running in 2b513872628e hello World ---> ff559047fd19 Removing intermediate container 2b513872628e Successfully built ff559047fd19 

查询1:为什么下面的执行没有导致任何结果? 我期待打印“你好世界”。 发生了什么事?

  root@labadmin-VirtualBox:/home/labadmin# docker run ff559047fd19 root@labadmin-VirtualBox:/home/labadmin# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a8eede1874a2 ff559047fd19 "/bin/bash" 27 seconds ago Exited (0) 26 seconds ago tiny_williams root@labadmin-VirtualBox:/home/labadmin# docker logs a8eede1874a2 #Above command has not resulted in any logs for this container. 

查询2:我可以按照以下方式运行执行步骤。 为什么它在下面的容器中执行了命令,为什么不运行容器a8eede1874a2?

  root@labadmin-VirtualBox:/home/labadmin# docker run -it ff559047fd19 root@486595ac9110:/# echo "hello world" hello world root@486595ac9110:/# exit exit root@labadmin-VirtualBox:/home/labadmin/RAGHU/welcome-page# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 486595ac9110 ff559047fd19 "/bin/bash" 22 seconds ago Exited (0) 7 seconds ago goofy_noyce a8eede1874a2 ff559047fd19 "/bin/bash" About a minute ago Exited (0) About a minute ago tiny_williams root@labadmin-VirtualBox:/home/labadmin# docker logs 486595ac9110 root@486595ac9110:/# echo "hello world" hello world root@486595ac9110:/# exit exit root@labadmin-VirtualBox:/home/labadmin/RAGHU/welcome-page# 

问题1:

根据Dockerfile参考 : RUN指令将在当前图像的顶层执行新图层中的任何命令并提交结果。 得到的结果图像将用于Dockerfile中的Dockerfile

所以当你执行RUN echo "hello World"echo "hello World"会打印出一个“hello world”。 并且返回代码0成功执行的执行结果已经被添加到上一层的顶层。 在你的情况下,上一层是MAINTAINER RAGHU的执行结果。

当你用你的映像ff559047fd19创build容器时, RUN echo "hello World"将不会再被执行,因为这个命令只会在映像build立过程中执行。 步骤3:

  Step 3 : RUN echo "hello World" ---> Running in 2b513872628e hello World 

问题2:

你创build了一个新的容器与你的形象ff559047fd19 。 由于ff559047fd19是基于Ubuntu的,所以你可以附加到你的新容器的bash。

  root@486595ac9110:/# echo "hello world" hello world 

在这里,您只需在新容器的bash中执行echo命令。

Docker镜像是使用(你猜对了!)docker容器逐层构build的。 要在运行容器时打印Hello World ,您需要在Dockerfile中指定一个入口点或CMD 。

采取从Dockerfile参考:

注意:不要将RUN与CMD混淆。 RUN实际上运行一个命令并提交结果; CMD在编译时不执行任何操作,但指定了图像的预期命令。

快速转到您的查询:

查询1:为什么下面的执行没有导致任何结果? 我期待打印“你好世界”。 发生了什么事?

在你的Dockerfile中,当你说RUN echo "hello world"时,docker实际上做了什么,它创build了一个中间容器,执行该命令并将容器的状态保存为运行下一个命令的层。 在你的例子中,你可以看到“hello world”实际上是在步骤3中打印出来的。

  Step 3 : RUN echo "hello World" ---> Running in 2b513872628e hello World 

而对于你的第二个查询:

查询2:我可以按照以下方式运行执行步骤。 为什么它在下面的容器中执行了命令,为什么不运行容器a8eede1874a2?

所以当你用a8eede1874a2的散列创build容器时,你实际上做的是什么都没有。 您尚未通过命令行指定CMD或ENTRYPOINT或命令。 你的容器开始和停止,因为没有什么可执行的。

现在在第二个例子中,您正在执行一个交互式shell,在其中运行echo "hello world"

示例Dockerfile:

 FROM ubuntu:14.04 MAINTAINER RAGHU CMD "echo hello World" 

有用的参考:

  • Dockerfile参考
  • Docker RUN
  • Docker入口
  • Docker CMD
  • Docker运行cmd (查找–entrypoint)