Как создать бинарный файл, содержащий zoneinfo.zip - PullRequest
0 голосов
/ 25 сентября 2018

Я использую Docker, чтобы создать приложение-контейнер и затем развернуть его на kubernetes engine , но когда приложение инициализируется, я получаю эту ошибку:

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

enter image description here

enter image description here

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

При использовании временного пакета Go, в частности метода LoadLocation, он ищет информацию о часовых поясах в различных местах.Это объясняется в комментариях к LoadLocation в исходном коде по адресу https://golang.org/src/time/zoneinfo.go. В частности, это выглядит в следующих местах:

  1. Местоположение, указанное в переменной среды ZONEINFO
  2. Известноместа, где хранятся файлы базы данных часовых поясов в операционных системах Unix
  3. Файл zoneinfo.zip в вашем $ GOROOT

Когда вы программируете на компьютере с Windows, скорее всего, Goпо умолчанию 3-й вариант.Однако, когда вы работаете с двоичным файлом, $ GOROOT не существует, поэтому он не будет работать в вашем контейнере.В большинстве версий Linux второй вариант будет работать нормально, так как они будут иметь необходимые файлы базы данных часовых поясов.Однако у меня есть сильное подозрение, что оптимизированный контейнер, на который вы ссылаетесь, этого не делает.Это оставляет вам опцию 1, которая, по сути, состоит из помещения ваших собственных файлов базы данных часовых поясов в контейнер, а затем ссылки на их местоположение с помощью переменной среды ZONEINFO.Это одновременно боль в заднице, и я также обнаружил, что она молча завершается неудачей, когда вы запрашиваете файл часового пояса, который не существует.

В своем решении этой проблемы я в итоге создал пакет, который использует метод LoadLocationFromTZData и пытается упростить процесс предоставления и работы с вашей собственной копией базы данных часовых поясов.Вы можете увидеть мой собственный вопрос о переполнении стека здесь: Определить, не работает ли ZONEINFO в Go .И вы можете увидеть репозиторий для моего пакета с часовым поясом здесь: https://github.com/slotheroo/knozone

0 голосов
/ 29 июля 2019

Я столкнулся с той же проблемой неделю назад и закончил тем, что решал вот так в Dockerfile.

Во-первых, вам нужно найти файл zoneinfo.zip.Например, на MacOS с Go, установленным через brew, может быть сложно.

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
0 голосов
/ 25 сентября 2018

Похоже, вы пытаетесь собрать свой Golang exec на контейнере среды Windows?Вы можете попытаться построить с правами GOOS=linux (Гусь) и GOARCH=amd64 (Горч).Если это не сработает, я рекомендую вам собрать его изначально в контейнере Linux.

...