我有一个关于从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
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.
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#
答案 0 :(得分:3)
Docker镜像是使用(你猜对了!)docker容器逐层构建的。要在尝试运行容器时让Hello World
进行打印,您需要在Dockerfile中指定ENTRYPOINT或CMD。
取自Dockerfile参考:
注意:请勿将RUN与CMD混淆。 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 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。
root@486595ac9110:/# echo "hello world"
hello world
在这里,您只需在新容器的bash中执行echo命令。