Как установить часовой пояс при использовании Python Alpine Docker image Docker image
При использовании Python Alpine Q4_X4_TNEMECALPER_4 мы должны добавить пакет tzdata перед установкой часового пояса.
При написании приложения на платформе Docker у меня возникла неожиданная проблема, да, еще одна.... Это был первый раз, когда мне пришлось показывать время на странице сайта, работающего на Docker , и оказалось, что время было UTC, а не местное время. В коде я просто использовал обычные вызовы Python для получения времени:
import datetime
...
now = datetime.datetime.now()
hour = now.hour
minute = now.minute
Я живу в Нидерландах, и когда было 9:30, время показанное на веб-странице было 8:30. Почему? Поиск в интернете показал, что Docker images на базе Ubuntu не имеет этой проблемы. Оказалось, проблема была в Alpine Docker image, я использую изображение Python 3.6-альпина. Размер этого изображения небольшой, но это потому, что они многое пропустили! Решение состоит в следующем:
- Добавление пакета tzdata в Docker image
- Установка часового пояса в Docker image
Добавить пакет tzdata очень просто. Я использую многоступенчатую сборку Docker , поэтому на первом этапе мы добавляем tzdata. На втором этапе мы копируем каталог zoneinfo с первого этапа на второй. В файле Docker мы также задаем часовой пояс:
FROM python:3.6-alpine as base
...
RUN apk add --update \
....
tzdata \
...
FROM python:3.6-alpine
...
COPY --from=base /usr/share/zoneinfo /usr/share/zoneinfo
ENV TZ=Europe/Amsterdam
После этих изменений на странице было показано правильное время. Единственным недостатком является то, что это добавляет еще несколько мегабайт.
Ссылки / кредиты
Setting the timezone
https://wiki.alpinelinux.org/wiki/Setting_the_timezone
Using local time in a Golang Docker container built from Scratch
https://medium.com/@mhcbinder/using-local-time-in-a-golang-docker-container-built-from-scratch-2900af02fbaf
Недавний
- Скрытие первичных ключей базы данных UUID вашего веб-приложения
- Don't Repeat Yourself (DRY) с Jinja2
- SQLAlchemy, PostgreSQL, максимальное количество строк для user
- Показать значения в динамических фильтрах SQLAlchemy
- Безопасная передача данных с помощью шифрования Public Key и pyNaCl
- rqlite: альтернатива dist с высокой степенью готовности и SQLite
Большинство просмотренных
- Используя Python pyOpenSSL для проверки SSL-сертификатов, загруженных с хоста
- Использование UUID вместо Integer Autoincrement Primary Keys с SQLAlchemy и MariaDb
- Подключение к службе на хосте Docker из контейнера Docker
- Использование PyInstaller и Cython для создания исполняемого файла Python
- SQLAlchemy: Использование Cascade Deletes для удаления связанных объектов
- Flask Удовлетворительный запрос API проверка параметров запроса с помощью схем Маршмэллоу