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)
- docker和VirtualBox VM中的Apache Kafka
- Docker运行不会部署
- 为什么Docker不向我的容器添加文件?
- docker服务更新:“无法在registry上访问图像以logging它的摘要”
- 如何使用kubernetes将parameter passing给docker
- 如何正确指定** FROM **值作为我的本地映像,而不是从Docker Hubregistry中?
- Windows 10上的Windows容器内部构build和Windows的Docker
- docker运行pseudoTTY(-t)即时标准输出,缓冲发生没有它
- login尝试Nexus OSS Docker回购投掷404