内置Golang二进制文件的Docker映像

内置Golang二进制文件的Docker映像,docker,go,Docker,Go,我有一个Go应用程序,我将其构建成二进制文件并作为Docker映像分发 目前,我正在使用ubuntu作为我的基本映像,但这会导致一个问题,即如果用户尝试使用UTC或其本地时区以外的时区,他们会收到一个错误,说明: pod error: panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory 导致此错误的原因是Go中的包需要该文件 我可以想出两种方法来解决这个问题: 继续使用ubuntubase映像,但

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

目前,我正在使用
ubuntu
作为我的基本映像,但这会导致一个问题,即如果用户尝试使用UTC或其本地时区以外的时区,他们会收到一个错误,说明:

pod error: panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory
导致此错误的原因是Go中的包需要该文件

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

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

  • 使用Golang的基础图像之一,例如
    Golang:1.7.5-alpine


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

    我更喜欢使用多级构建。在第一步中,您使用特殊的golang building容器来安装所有依赖项并构建应用程序。在第二阶段,我将二进制文件复制到空的
    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
    

    您可以使用系统的数据。或者您可以将
    $GOROOT/lib/time/zoneinfo.zip
    复制到您的图像中,这是系统版的精简版。

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

    由于并非所有操作系统都安装了本地化时区,因此我采取了以下措施使其正常工作:

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

    添加时区的多步骤Docker映像的完整示例是

    如果需要
    tzdata
    软件包,则需要安装该软件包。你在用什么图像构建二进制文件?我目前没有在容器中构建。我确实打算通过使用
    golang:1.7.5-alpine
    容器进行构建来解决这个问题。如果您没有使用alpine进行构建,那么如果您打算使用alpine发布,您需要确保您正在构建一个静态二进制文件。无论哪种方式,如果在程序中使用zoneinfo,您都需要在最终容器中使用它。@JimB我当前正在为当前运行时容器构建一个静态二进制文件。关于zoneinfo,我正在试图找出将其放入最终容器中的最佳方式——我应该在我的
    ubuntu
    容器中安装
    tzdata
    包,还是使用
    golang
    容器中的一个。这完全取决于您。您可以查看相关的DockerFile,并查看其中一个是否比另一个更适合您的需要。这种方法没有“正确”的答案,您的最终运行时容器将不会在
    /usr/local/go/lib/time/
    though@xbonez当然,如果你需要一些没有被编译成二进制的数据文件,你可以添加它们。这样你就可以得到最少的图像-只需要你需要的东西。谢谢。将此标记为已接受,因为这是我最终采用的方法。