Docker微容器

我正在试验微容器。 我创build了下面的Dockerfile。 这个想法是,这个Docker文件从一个非常小的基本图像开始。 (5 MB)安装构build工具,进行构build,然后删除构build工具。

FROM alpine ENTRYPOINT ["/bin/dockerdemo"] RUN apk update RUN apk add -t build-deps build-base go git COPY . /go/src/dockerdemo RUN cd /go/src/dockerdemo \ && export GOPATH=/go \ && go get \ && go build -o /bin/dockerdemo \ && rm -rf /go RUN apk del --purge build-base go git 

我期待它真的很小。 但它是358 MB。 看来最后一个命令并没有真正删除构build组件。

我对Docker来说很新,所以我可能完全错过了这里的东西。

图像上的文件系统也可能没有被压缩,因此即使构build组件文件不存在,文件系统仍然是358 MB。

如果步骤对文件系统进行了更改,则docker文件中的每个COMMAND都可以提交新的映像文件系统层 。

即使您RUN rm -rf /之后的所有其他步骤,图像仍然会存储在图像中的每个以前的图层的内容。

在一个RUN步骤中安装并删除,以避免提交不想保留的文件系统更改:

 FROM alpine ENTRYPOINT ["/bin/dockerdemo"] COPY . /go/src/dockerdemo RUN set -uex; \ apk update; \ apk add -t build-deps build-base go git; \ cd /go/src/dockerdemo; \ export GOPATH=/go; \ go get; \ go build -o /bin/dockerdemo; \ rm -rf /go; \ apk del --purge build-base go git 

你会注意到当使用这个设置时,所有的步骤将不得不每次都运行,所以你失去了一些Dockerscaching的好处。

构build图像

如果您在构build周转时间方面存在问题,另一种方法是使用与运行应用程序的映像分离的特定构build映像。

关于Go的一个很酷的事情是你可以build立没有依赖关系的静态二进制文件 ,并FROM scratch运行,从而产生一个真正的微容器。

正如Mark O'Connor指出的那样,您可能不需要为构build设置自己的图像,因为您可以使用官方的golang图像 。

 FROM golang COPY . /go/src/dockerdemo RUN set -uex; \ cd /go/src/dockerdemo; \ export GOPATH=/go; \ go get; \ CGO_ENABLED=0 GOOS=linux go build -ldflags "-s" -a -installsuffix cgo -o /bin/dockerdemo; 

从图像中提取二进制文件

 docker run go-build tar -cvf /bin/dockerdemo > dockerdemo.tar 

从它构build应用程序容器

 FROM scratch ADD dockerdemo.tar / ENTRYPOINT ["/bin/dockerdemo"] 

你确定它不是build-depsbuild-basego ,和/或git占用了350 MB吗?

为什么不使用Docker中心的官方golang镜像呢? 它有一个高山选项。

https://hub.docker.com/_/golang/

结帐1.8高山 Dockerfile:


Docker是一个分层的附加文件系统。 这意味着文件并没有被真正删除。 您需要导出/导入,以将所有内容压缩到单个图层。