2017-01-20 4 views
0

У меня есть ящик Linux, работающий с контейнером Docker, который работает с TomEE, и запускает WAR, который я построил.OpenJDK 1.8.0 в контейнере Docker имеет разную часовую зону, чем/etc/timezone, и от хоста

На базовом ящике Linux я получаю значение «дата» «Fri Jan 20 10:37:27 PST 2017». Переменная окружения TZ не установлена.

Когда я запускаю следующий класс:

import java.util.Date; 
import java.util.TimeZone; 

public class DatePrint { 
     public static void main(String[] args) { 
       System.out.println("date[" + new Date() + "] tzoffset[" + TimeZone.getDefault().getOffset(new java.util.Date().getTime()) + "]"); 
     } 
} 

я получаю это:

date[Fri Jan 20 10:39:02 PST 2017] tzoffset[-28800000] 

Это все хорошо.

В моем контейнере Docker, работающем на коробке, где у меня есть «-v/etc/localtime:/etc/localtime» как одно из сопоставлений томов, я, очевидно, имею тот же файл/etc/localtime. Переменная окружения TZ не установлена. Когда я запускаю «дату» внутри контейнера, я получаю значение времени в том же часовом поясе (PST), что и в базовом хосте.

я затем скомпилировать и запустить тот же класс Java, как указано выше, и я получаю следующее:

date[Fri Jan 20 18:30:38 UTC 2017] tzoffset[0] 

я вручную установить переменную окружения TZ в контейнере (помните, что он не установлен в основной хост) в «America/Los_Angeles» (я проверил это значение, посмотрев на файл, который символизирует ссылки «/ etc/localtime» на базовом хосте).

Затем я перезапустил класс на контейнер и получил это:

date[Fri Jan 20 10:35:08 PST 2017] tzoffset[-28800000] 

Обратите внимание, что обе версии Java на базовый хост и емкость практически идентична. Они оба OpenJDK 1.8.0_111 (b15 на хосте, b14 на контейнере).

Итак, может кто-нибудь объяснить, что здесь происходит? На базовом хосте у меня было «etc/localtime», указывающее на правильный файл, но у меня не было набора TZ. Он сообщает правильный часовой пояс с «датой» и в классе Java. В контейнере «/ etc/localtime» указывает на правильный файл, и изначально у меня не было TZ. Команда «date» возвращает правильное значение, но Java не сделал этого.

Мне пришлось вручную установить TZ на контейнере на значение TZ от хоста, и это заставило его работать. Я бы не хотел этого делать. Мне это кажется взломанным.

Обновление:

я заметил следующее в «МестноеВремя (5)» человек страницы:

Поскольку идентификатор часового пояса извлекается из мишени SymLink имя/и т.д./МестноеВремя , этот файл может не быть обычным файлом или жесткой линией.

Таким образом, это может быть частью моей проблемы. Любопытно, что «дата» из оболочки отлично работает, но Java (без настройки TZ) запутывается.

ответ

0

Может быть, выгрузить среду (команда env), LC_ * (обычно LC_ALL) может влиять на нее.

1

У меня была такая же проблема, как у вас (CentOS, Docker, OpenJDK).Мы решили это так:

Не монтируйте локальное время, установите/etc/timezone.

Если вы не имеете/и т.д./файл временной зоны (например, на CentOS), вы можете сделать что-то вроде этого (на хосте):

timedatectl | awk '/Time zone:/ {print $3}' > /etc/timezone_host 

Затем в контейнере (например, точка входа)

TZ_HOST=$(cat /etc/timezone_host) 
echo $TZ_HOST > /etc/timezone 
export TZ=$TZ_HOST 
dpkg-reconfigure --frontend noninteractive tzdata 

 Смежные вопросы

  • Нет связанных вопросов^_^