我制作了一个相当大的Docker容器。当我提交容器来创建图像时,图像大约为7.8 GB。但当我export
容器(不是save
图像!)到tarball并重新导入它时,图像只有3 GB大。当然历史遗失了,但这对我来说没问题,因为图像已经完成了#34;在我看来并准备部署。
如何在不将图像/容器导出到磁盘并再次导入的情况下展平图像/容器?并且:这样做是明智的想法还是我错过了一些重要的观点?
答案 0 :(得分:23)
从Docker 1.13开始,您可以使用--squash
标志。
1.13版之前:
据我所知,你不能使用Docker api。 docker export
和docker import
是针对此方案而设计的,正如您自己已经提到的那样。
如果您不想保存到磁盘,则可能会将导出的输出流传输到导入的输入流中。我没有测试过这个,但试试
docker export red_panda | docker import - exampleimagelocal:new
答案 1 :(得分:19)
现在Docker已经在17.05发布了多阶段版本,你可以将你的版本重新格式化为:
FROM buildimage as build
# your existing build steps here
FROM scratch
COPY --from=build / /
CMD ["/your/start/script"]
结果将是您的构建环境图层缓存在构建服务器上,但只有一个展平的副本将存在于您标记和推送的结果图像中。
注意,您通常会将其重新构造为具有复杂的构建环境,并且只复制几个目录。这里有一个例子,Go从源代码和单个构建命令制作单个二进制映像,而无需在主机上安装Go并在docker之外编译:
$ cat Dockerfile
ARG GOLANG_VER=1.8
FROM golang:${GOLANG_VER} as builder
WORKDIR /go/src/app
COPY . .
RUN go-wrapper download
RUN go-wrapper install
FROM scratch
COPY --from=builder /go/bin/app /app
CMD ["/app"]
go文件是一个简单的hello世界:
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello, world.\n")
}
构建创建环境,构建环境和临时环境,然后标记临时标记:
$ docker build -t test-multi-hello .
Sending build context to Docker daemon 4.096kB
Step 1/9 : ARG GOLANG_VER=1.8
--->
Step 2/9 : FROM golang:${GOLANG_VER} as builder
---> a0c61f0b0796
Step 3/9 : WORKDIR /go/src/app
---> Using cache
---> af5177aae437
Step 4/9 : COPY . .
---> Using cache
---> 976490d44468
Step 5/9 : RUN go-wrapper download
---> Using cache
---> e31ac3ce83c3
Step 6/9 : RUN go-wrapper install
---> Using cache
---> 2630f482fe78
Step 7/9 : FROM scratch
--->
Step 8/9 : COPY --from=builder /go/bin/app /app
---> Using cache
---> 5645db256412
Step 9/9 : CMD /app
---> Using cache
---> 8d428d6f7113
Successfully built 8d428d6f7113
Successfully tagged test-multi-hello:latest
查看图像,只有单个二进制文件出现在图像中,而构建环境超过700MB:
$ docker images | grep 2630f482fe78
<none> <none> 2630f482fe78 6 days ago 700MB
$ docker images | grep 8d428d6f7113
test-multi-hello latest 8d428d6f7113 6 days ago 1.56MB
是的,它运行:
$ docker run --rm test-multi-hello
Hello, world.
答案 2 :(得分:0)
使用--squash
标志构建图像:
还要考虑清除不需要的文件,例如apt cache:
跑apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*