Go 如何创建包含zoneinfo.zip的二进制文件

Go 如何创建包含zoneinfo.zip的二进制文件,go,kubernetes,containers,google-kubernetes-engine,Go,Kubernetes,Containers,Google Kubernetes Engine,我正在使用Docker创建一个容器应用程序,然后将其部署到,但当应用程序初始化时,我收到以下错误: err: open C:\Go/lib/time/zoneinfo.zip: no such file or directory 看起来您正试图在Windows环境容器上构建Golang exec?您可以尝试使用正确的GOOS=linux(Goose)和GOARCH=amd64(Gorch)进行构建。如果这不起作用,我建议您在Linux容器上本地构建它。当使用Go的时间包,特别是LoadLoc

我正在使用Docker创建一个容器应用程序,然后将其部署到,但当应用程序初始化时,我收到以下错误:

err: open C:\Go/lib/time/zoneinfo.zip: no such file or directory


看起来您正试图在Windows环境容器上构建Golang exec?您可以尝试使用正确的
GOOS=linux
(Goose)和
GOARCH=amd64
(Gorch)进行构建。如果这不起作用,我建议您在Linux容器上本地构建它。

当使用Go的时间包,特别是LoadLocation方法时,它会在不同的位置查找信息。这在源代码中的LoadLocation注释中进行了解释。具体地说,它在这些地方看起来:

  • 由ZONEINFO环境变量指定的位置
  • Unix操作系统上保存时区数据库文件的已知位置
  • $GOROOT中的zoneinfo.zip文件
  • 在Windows计算机上编程时,Go很可能默认为第三个选项。但是,当您使用二进制文件时,没有$GOROOT,因此在您的容器中不起作用。在大多数版本的Linux上,第二个选项可以正常工作,因为它们具有必要的时区数据库文件。但是,我强烈怀疑您引用的优化容器没有。这就给您留下了选项1,它基本上包括将您自己的时区数据库文件放在容器上,然后使用ZONEINFO环境变量引用它们的位置。这是一种让人头疼的事情,我还发现,当你请求一个不存在的时区文件时,它会悄悄地失败


    在我自己解决这个问题的过程中,我最终创建了一个利用LoadLocationFromTZData方法的包,并试图简化提供和使用您自己的时区数据库副本的过程。您可以在此处看到我自己的堆栈溢出问题:。你可以在这里看到我的时区软件包的存储库:

    我一周前遇到了同样的问题,最后在Dockerfile上解决了这个问题

    首先,您需要找到
    zoneinfo.zip
    文件。例如,在通过brew安装Go的MacOS上,可能会变得棘手

    tztest$ go env GOROOT
    /usr/local/Cellar/go/1.12.7/libexec
    tztest$ ls -l /usr/local/Cellar/go/1.12.7/libexec/lib/time/zoneinfo.zip
    -rwxr-xr-x  1 mau  staff  365447 Jul  8 16:29 /usr/local/Cellar/go/1.12.7/libexec/lib/time/zoneinfo.zip
    
    因此,解决方法是复制
    zoneinfo.zip
    ,并将其包含在Dockerfile的同一目录中。从这里开始,只需将文件添加到docker构建过程并覆盖环境变量

    ADD zoneinfo.zip /zoneinfo.zip
    ENV ZONEINFO /zoneinfo.zip
    

    你可以考虑建立你的GO应用程序(2020年8月,两年后)

    新的嵌入式数据包 Go 1.15包括一个新的包,它允许将时区数据库嵌入到程序中

    • 导入此软件包(如
      import u“time/tzdata”
      )允许程序查找时区信息,即使本地系统上没有时区数据库
    • 您还可以通过使用
      -tags timetzdata
      构建来嵌入时区数据库
    任何一种方法都会将程序的大小增加约800 KB


    这样,一旦作为Docker映像部署到Kubernetes引擎,它就不必尝试加载任何时区信息,因为这些信息嵌入到它的程序中。

    是的,我使用的是windows,但我在构建二进制文件时这样做了,节点中的操作系统是golang的错误,但我猜您可能编译为非静态二进制文件,可能正在从本地env.time.LoadLocation获取内容,需要zoneinfo.zip加载时区;与此相关谢谢:染料,我真的做到了,对我来说幸运的是,我只需要一个时区,那就是我的时区(至少现在),希望这很快得到修复,357B是zoneinfo.zip的大小,将它添加到二进制文件中不会伤害任何人