Go не находит /usr/share/zoneinfo в док-контейнере

В программе Go я вызываю time.LoadLocation("Europe/Berlin"), и она возвращает сообщение об ошибке open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory, хотя в контейнере (работает alpine:3.9 с установленным tzdata) /usr/share/zoneinfo/Europe/Berlin существует и, согласно docs, должен иметь приоритет над zip-файлом. Эта же программа находит файл на моей машине (Arch Linux). Исполняемый файл был статически связан на моей машине, а затем скопирован в контейнер. Пробовал Go 1.11.5 и 1.10.3.

Я построил исполняемый файл с помощью:

CGO_ENABLED=0 go build -a -ldflags "-s" -o gocake_static

Я ищу любые идеи, которые помогут мне определить проблему.


person rausch    schedule 14.02.2019    source источник
comment
Указывали ли вы ОС и архитектуру контейнера при сборке этого исполняемого файла? Можете ли вы поделиться командой, с помощью которой вы создаете исполняемый файл?   -  person mkopriva    schedule 14.02.2019
comment
... установлена ​​ли переменная env ZONEINFO в контейнере, и если да, то каково ее значение?   -  person mkopriva    schedule 14.02.2019
comment
@mkopriva Нет, я этого не делал. Однако это должна быть та же архитектура, не так ли? Я добавил команду сборки в свой вопрос.   -  person rausch    schedule 14.02.2019
comment
@mkopriva Установка переменной ZONEINFO, похоже, не имеет значения. Я попытался установить его на /usr/share/zoneinfo.   -  person rausch    schedule 14.02.2019
comment
Пакет tzdata установлен? (В официальных образах Ubuntu его нет).   -  person kostix    schedule 14.02.2019
comment
@kostix Да, это так.   -  person rausch    schedule 14.02.2019
comment
Посмотрите, как среда выполнения Go ищет информацию о часовом поясе (для 1.11.5); здесь находятся местоположения в UNIX -совместимость. По сути, кажется, что представление Alpine Linux о том, где находится tzdata, отличается от представления Go stdlib.   -  person kostix    schedule 14.02.2019
comment
То, что вы видите, это неспособность кода stdlib найти tzdata в любом из известных встроенных расположений, поэтому последний вариант, который пытается найти zip-архив с tzdata в корневом каталоге Go установки, терпит неудачу, и показано.   -  person kostix    schedule 14.02.2019
comment
Я не мог воспроизвести проблему под go:1.11.5 и alpine:3.9 с установленным tzdata. Я собрал двоичный файл ( GOOS=linux GOARCH=amd64 CGO_ENABLED=0 ) на Mac и поместил его в альпийский контейнер. Я не устанавливал переменную ZONEINFO. Существуют ли другие переменные env, которые могут вызвать проблему?   -  person Hunsin    schedule 15.02.2019


Ответы (1)


если вы используете только один статический zoneinfo. возможно, FixedZone может решить вашу проблему.

Для этого не требуется timezone.zip, поэтому нет необходимости загружать zoneinfo.zip и устанавливать env ZONEINFO в Dockerfile.

Например

loc := time.FixedZone("Europe/Berlin", 1*60*60)
fmt.Println(time.Now().In(loc).Format("2006-01-02 15:04:05"))
person Lifei Chen    schedule 12.12.2019