2

我有一个关于在 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”。出了什么问题?

 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# 
4

2 回答 2

4

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

取自 Dockerfile 参考:

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

快速继续您的查询:

查询1:为什么下面的执行没有产生任何结果?我期待打印“hello World”。出了什么问题?

在你的 Dockerfile 中,当你说 dockerRUN 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"

有用的参考资料:

于 2016-09-27T17:57:05.283 回答
2

问题一:

根据Dockerfile 参考:该RUN指令将在当前图像之上的新层中执行任何命令并提交结果。生成的提交图像将用于Dockerfile.

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

当你用你的镜像创建容器时ff559047fd19RUN 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 命令。

于 2016-09-27T17:59:26.267 回答