2016-09-27 128 views
0

我有一个关于从Dockerfile执行容器中的命令的查询。Docker:为什么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:为什么下面的执行并没有导致任何结果?我期待打印“hello world”。发生了什么问题?

[email protected]:/home/labadmin# docker run ff559047fd19 
[email protected]:/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 
[email protected]:/home/labadmin# docker logs a8eede1874a2 
#Above command has not resulted in any logs for this container. 

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

[email protected]:/home/labadmin# docker run -it ff559047fd19 
[email protected]:/# echo "hello world" 
hello world 
[email protected]:/# exit 
exit 
[email protected]:/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 
[email protected]:/home/labadmin# docker logs 486595ac9110 
[email protected]:/# echo "hello world" 
hello world 
[email protected]:/# exit 
exit 
[email protected]:/home/labadmin/RAGHU/welcome-page# 

回答

2

问题1:

根据Dockerfile reference:本RUN指令将在当前图像的顶部上的新的层执行任何命令和提交的结果。得到的拼接图像将用于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。

[email protected]:/# echo "hello world" 
hello world 

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

3

码头图像使用(你猜对了!)码头容器逐层建立。要在运行容器时打印Hello World,您需要在Dockerfile中指定ENTRYPOINTCMD

从Dockerfile参考摘自:

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

移动上快速定位到您查询:

问题1:为什么下面的执行并没有导致任何结果 ?我期待打印“hello world”。发生了什么问题?

在你Dockerfile,当你说什么RUN echo "hello world"码头工人实际上做的是它创建了一个中间容器,执行该命令并保存容器的状态,在其上会遇到下一个命令层。在您的例子中,你可以看到的“Hello World”实际上在步骤3

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

并为您的第二个查询打印:

问题2:我能够运行执行步骤如下。 为什么它在下面的容器中执行命令,为什么不运行容器a8eede1874a2时为 ?

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

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

例Dockerfile:

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

有用的引用:

相关问题