创建一个简单的Docker父映像实际上有什么作用?

时间:2018-10-03 12:34:14

标签: docker docker-image

我正在按照building a parent image上Docker网站上的说明进行操作。我是Docker的新手。我使用的是CentOS 7.5。

  1. 我运行了CentOS的Docker网站上建议的mkimage-yum.sh脚本。我不明白为什么脚本的最后一行rm -rf "$target"在那里,因为它似乎删除了脚本完成的所有工作。因此我将其注释掉,并留下一个目录/tmp/mkimage-yum.sh.ahE8xx,该目录看起来像是具有典型linux文件结构(例如/usr//etc/)的最小linux映像

  2. 在我的主目录中,我编译了程序

main.c

#include <stdio.h>
#include <stdlib.h>

int main(void){
    printf("Hello Docker World!\n");

    return 0;
}

使用gcc -static -static-libgcc -static-libstdc++ -o hello main.c,按照Docker网页中的规定将代码编译为静态链接的可执行文件。

  1. 我创建了Dockerfile

例如

FROM scratch
ADD hello /
CMD ["/hello"]
  1. 我启动dockerd服务器,然后在另一个终端中运行docker build --tag hello .

输出为:

Sending build context to Docker daemon 864.8 kB
Step 1/3 : FROM scratch
 --->
Step 2/3 : ADD hello /
 ---> Using cache
 ---> a38d49d40e50
Step 3/3 : CMD /hello
 ---> Using cache
 ---> 3bcbb04c367f
Successfully built 3bcbb04c367f

天哪,看起来很有效!但是,我仍然仅在执行此操作的目录中看到Dockerfile hello main.c。 Docker显然认为它做了什么,但是呢?它没有创建任何新文件。

  1. 现在我运行docker run --rm hello,它输出Hello Docker World!

但是,我从dockerd服务器上收到了令人不安的错误消息:

ERRO[502548] containerd: deleting container                error=exit status 1: "container f336b3a5505879453b4f7a00c06acf274d0a5f8b3d260762273a2d7c0a846141 does not exist\none or more of the container deletions failed\n"
WARN[502548] f336b3a5505879453b4f7a00c06acf274d0a5f8b3d260762273a2d7c0a846141 cleanup: failed to unmount secrets: invalid argument

问题

  1. docker build --tag hello .到底做了什么?我没有看到任何输出。

  2. dockerd错误到底是什么?也许正在寻找不是由docker build创建的docker镜像?

  3. mkimage-yum.sh如何适应这一需求?为什么会删除最后的所有工作。

2 个答案:

答案 0 :(得分:0)

使用--rm运行docker run时,容器将运行,然后删除自身。如果要保留容器,请从命令中删除--rm
在您需要的情况下,命令docker build将抓取dockerfile并创建一个本地映像,映像名称为hello

答案 1 :(得分:0)

您将不会在文件夹中看到任何其他文件。要查看创建的图像,请运行命令docker images。在这里,您应该可以看到使用标签hello构建的图像。

运行docker run <imagename>时,它将启动包含所提供图像的容器。这就是为什么您看到C程序的输出