首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >默认情况下,Docker scratch包含哪些内容?

默认情况下,Docker scratch包含哪些内容?
EN

Stack Overflow用户
提问于 2017-08-16 20:50:38
回答 1查看 1.4K关注 0票数 5

我可以选择使用FROM scratch,它看起来是构建Go容器的一种非常有吸引力的方法。

我的问题是,为了可靠地运行Go二进制文件,还需要添加什么吗?编译后的Go二进制文件似乎至少在我的笔记本上运行。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-16 20:59:30

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

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

FROM scratch的一个很好的替代方案是FROM alpine,它将包括一个基本的阿尔卑斯图像--它非常小(我相信这是5 MiB ),并且包含musl,它与Go兼容,允许您链接到C库,并且可以在不设置CGO_ENABLED=0的情况下编译。您还可以利用阿尔卑斯山定期更新的事实,使用其tzinfo和ca证书。

(值得注意的是,Docker层的开销由于Docker的去重复而被摊销,当然,这被基本图像更新的频率所否定。尽管如此,它还是有助于推销使用非常小的阿尔卑斯山图像的想法。

您现在可能不需要tzinfo或ca-certs,但最好是安全而不是遗憾;您可以意外地添加依赖项,而不知道它破坏了您的构建。因此,我建议使用alpine作为您的基础。alpine:latest应该没事。

奖励:如果您想要在Docker内部创建可重复生成的优点,但是图像大小很小,您可以使用Docker 17.06+中提供的新Docker多阶段构建。

它的工作有点像这样:

代码语言:javascript
复制
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表单不能工作(它依赖于具有/bin/sh的Docker映像,而它不会)。这在阿尔卑斯山会很好。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45722785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档