gpt4 book ai didi

docker - 如何扁平化 Docker 镜像?

转载 作者:IT老高 更新时间:2023-10-28 12:37:04 24 4
gpt4 key购买 nike

我制作了一个相当大的 Docker 容器。当我提交容器以创建图像时,图像大小约为 7.8 GB。但是当我 export 容器(不是 save 图像!)到一个 tarball 并重新导入它时,图像只有 3 GB 大。当然历史丢失了,但这对我来说没问题,因为我认为图像已经“完成”并且可以部署了。

如何在不将图像/容器导出到磁盘并再次导入的情况下展平图像/容器?并且:这样做是一个明智的想法还是我错过了一些重要的点?

最佳答案

现在 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 world:

$ 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.

关于docker - 如何扁平化 Docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22713551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com