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

时间:2016-09-27 17:28:06

标签: docker dockerfile docker-container

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

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

构建过程

 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# 

2 个答案:

答案 0 :(得分:3)

Docker镜像是使用(你猜对了!)docker容器逐层构建的。要在尝试运行容器时让Hello World进行打印,您需要在Dockerfile中指定ENTRYPOINTCMD

取自Dockerfile参考:

  

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

快速查看您的查询:

  

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

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

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

对于你的第二个问题:

  

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

所以当你用a8eede1874a2的散列创建容器时,你实际上做的很好......没什么。您尚未通过命令行指定CMD或ENTRYPOINT或命令。您的容器已启动和停止,因为无法执行任何操作。

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

示例Dockerfile:

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

有用的参考资料:

答案 1 :(得分:2)

问题1:

根据Dockerfile referenceRUN指令将在当前图像之上的新图层中执行任何命令并提交结果。生成的评分图像将用于Dockerfile

中的下一步

因此,当您执行RUN echo "hello World"时,echo "hello World"将打印出“hello World”。并且使用返回码0成功执行的执行结果已添加为上一层顶部的新布局。在您的情况下,前一层是MAINTAINER RAGHU的执行结果。

使用图像ff559047fd19创建容器时,RUN echo "hello World"将不会再次执行,因为此命令仅在图像构建过程中执行。这是第3步:

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

问题2:

您使用图片ff559047fd19创建了一个新容器。由于ff559047fd19基于ubuntu,因此您可以附加到新容器的bash。

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

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