用于构建Golang二进制文件的Docker镜像

时间:2017-10-02 18:48:15

标签: docker go

我有一个Go应用程序,我构建成二进制文件并分发为Docker镜像。

目前,我使用ubuntu作为我的基本映像,但这会导致一个问题,即如果用户尝试使用UTC以外的时区或其本地时区,则会收到错误消息:< / p>

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

  3. 推荐的方式是什么?我不确定是否需要或应该使用Golang图像,因为这是预先构建的二进制文件运行的容器。我的理解是Golang图像最适合构建二进制文件。

4 个答案:

答案 0 :(得分:2)

我更喜欢使用多阶段构建。在第一步,您使用特殊的golang构建容器来安装所有依赖项并构建应用程序。在第二阶段,我将二进制文件复制到空alpine容器。这允许同时拥有所有必需的工具和最小的泊坞窗图像(在我的情况下为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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

由于并非所有操作系统都安装了本地化的时区,所以我要做的是使其工作:

ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip

用于添加时区的多步骤Docker映像的完整示例为here