用于构buildGolang二进制文件的Docker映像

我有一个Go应用程序,我将其构build为一个二进制文件并将其作为Docker映像进行分发。

目前,我使用ubuntu作为我的基本映像,但是这会导致一个问题,如果用户尝试使用除UTC以外的时区或其本地时区,则会显示以下错误消息:

 pod error: panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory 

此错误是由于Go中的LoadLocation包需要该文件而引起的。

我可以想出两个方法来解决这个问题:

  1. 继续使用ubuntu基础映像,但在我的Dockerfile中添加命令: RUN apt-get install -y tzdata

  2. 使用Golang的基本图像之一,例如。 golang:1.7.5-alpine

什么是推荐的方式? 我不确定是否需要或应该使用Golang映像,因为这是预构build二进制文件运行的容器。 我的理解是,Golang图像对于首先构build二进制文件非常有用。

这是更多的投票,但apt-get是我们(我公司的技术小组)在这样的情况下所做的。 它使我们可以完全控制图像的层次结构,但是假设您可能有基于这个图像的未来图像。

我更喜欢使用多阶段构build。 第一步,您使用特殊的golang构build容器来安装所有的依赖关系,并构build一个应用程序。 在第二阶段,我将二进制文件复制到空的alpine容器中。 这允许所有需要的工具和最小docker图像同时(在我的情况下,6MB而不是280MB)。

Dockerfile示例:

 # build stage FROM golang:1.8 ADD . /src RUN set -x && \ cd /src && \ go get -t -v github.com/lisitsky/go-site-search-string && \ CGO_ENABLED=0 GOOS=linux go build -a -o goapp # final stage FROM alpine WORKDIR /app COPY --from=0 /src/goapp /app/ ENTRYPOINT /goapp EXPOSE 8080 

你可以使用系统的tzdata。 或者,您可以将$GOROOT/lib/time/zoneinfo.zip复制到您的图像中,该图像是系统的修剪版本。