gpt4 book ai didi

docker - Docker scratch 默认包含什么?

转载 作者:IT王子 更新时间:2023-10-29 00:49:59 27 4
gpt4 key购买 nike

对我来说,有一个使用FROM scratch 的选项,这看起来是构建我的 Go 容器的一种非常有吸引力的方式。

我的问题是它仍然有什么 native 运行二进制文件我需要添加任何东西才能可靠地运行 Go 二进制文件吗?编译后的 Go 二进制文件似乎至少可以在我的笔记本电脑上运行。

出于安全和基础设施管理的原因,我的目标是将图像大小保持在最低限度。在最佳情况下,我的容器将无法在构建阶段之外执行二进制文件或 shell 命令。

最佳答案

划痕图像不包含任何内容。没有文件。但实际上,这对你有利。事实证明,使用 CGO_ENABLED=0 构建的 Go 二进制文件除了它们使用的内容外,绝对不需要任何东西。有几件事要记住:

  • 使用CGO_ENABLED=0,您不能使用任何C 代码。其实并不太难。
  • 使用 CGO_ENABLED=0,您的应用将不会使用系统 DNS 解析器。我不认为默认情况下它会这样做,因为它是阻塞的,而 Go 的 native DNS 解析器是非阻塞的。
  • 您的应用可能依赖于一些不存在的东西:
    • 进行 HTTPS 调用(如调用其他服务,例如 Amazon S3 或 Stripe API)的应用程序将需要 ca-certs 以确认 HTTPS 证书的真实性。这也必须随着时间的推移而更新。这不是提供 HTTPS 内容所必需的。
    • 需要时区感知的应用需要时区信息文件。

FROM scratch 的一个不错的替代方法是 FROM alpine,它将包含一个基本的 Alpine 镜像——它非常小(我相信是 5 MiB)并且包含 musl libc,它与 Go 兼容,允许您链接到 C 库以及在不设置 CGO_ENABLED=0 的情况下进行编译。您还可以利用 alpine 定期更新的事实,使用它的 tzinfo 和 ca-certs。

(值得注意的是,由于 Docker 的重复数据删除功能,Docker 层的开销被分摊了一点,当然,这会被基础镜像的更新频率所抵消。不过,它有助于推销使用相当小的 Alpine 的想法图片。)

您现在可能不需要 tzinfo 或 ca-certs,但安全总比后悔好;您可能会不小心添加依赖项而没有意识到它会破坏您的构建。所以我建议使用 alpine 作为你的基础。 alpine:latest 应该没问题。

奖励:如果您希望在 Docker 中获得可重现构建的优势,但图像尺寸较小,则可以使用 Docker 17.06+ 中提供的新 Docker 多阶段构建。

它的工作原理有点像这样:

FROM golang:alpine
ADD . /go/src/github.com/some/gorepo # may need some go getting if you don't vendor
RUN go build -o /app github.com/some/gorepo

FROM scratch # or alpine
COPY --from=0 /app /app
ENTRYPOINT ["/app"]

(如果我有任何错误,我深表歉意,我是凭内存输入的。)

请注意,使用FROM scratch时,必须使用ENTRYPOINT的exec形式,因为shell形式不起作用(这取决于具有的Docker镜像>/bin/sh,它不会。)这在 Alpine 中可以正常工作。

关于docker - Docker scratch 默认包含什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45722785/

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