Hoe de tijdzone in te stellen bij gebruik van de Python Alpine Docker image
Bij gebruik van een Python Alpine Docker image moeten we het tzdatapakket toevoegen voordat we de tijdzone kunnen instellen.
Tijdens het schrijven van een applicatie op mijn Docker platform raakte ik een onverwacht probleem, ja, nog een ... Dit was de eerste keer dat ik de tijd moest laten zien op een pagina van een website die draait op Docker en het bleek dat de tijd UTC was in plaats van lokale tijd. In de code gebruikte ik gewoon de normale Python calls om de tijd te krijgen:
import datetime
...
now = datetime.datetime.now()
hour = now.hour
minute = now.minute
Ik woon in Nederland en toen het 9:30 uur was, was de tijd op de webpagina 8:30 uur. Waarom? Bij het zoeken op het internet bleek dat Docker image's op basis van Ubuntu dit probleem niet hadden. Het probleem bleek met de Alpine Docker image te zijn, ik gebruik de Python 3.6-alpine afbeelding. Het formaat van deze foto is klein, maar dat komt omdat ze veel weggelaten hebben! De oplossing bestaat uit:
- Toevoegen van het tzdatapakket aan het Docker image
- Instellen van de tijdzone in de Docker image
Het toevoegen van het tzdata pakket is eenvoudig. Ik gebruik Docker meerfasige builds, dus in de eerste fase voegen we tzdata toe. In de tweede fase kopiëren we de zoneinfo directory van de eerste fase naar de tweede fase. In het Docker-bestand stellen we ook de tijdzone in:
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
Na deze wijzigingen werd de juiste tijd getoond in de pagina. Het enige nadeel is dat dit nog enkele MB's extra toevoegt.
Links / credits
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
Recent
- Database UUID primaire sleutels van je webapplicatie verbergen
- Don't Repeat Yourself (DRY) met Jinja2
- SQLAlchemy, PostgreSQL, maximum aantal rijen per user
- Toon de waarden in SQLAlchemy dynamische filters
- Veilige gegevensoverdracht met Public Key versleuteling en pyNaCl
- rqlite: een alternatief voor SQLite met hoge beschikbaarheid en distributed
Meest bekeken
- Met behulp van Python's pyOpenSSL om SSL-certificaten die van een host zijn gedownload te controleren
- Gebruik van UUIDs in plaats van Integer Autoincrement Primary Keys met SQLAlchemy en MariaDb
- PyInstaller en Cython gebruiken om een Python executable te maken
- Maak verbinding met een dienst op een Docker host vanaf een Docker container
- SQLAlchemy: Gebruik van Cascade Deletes om verwante objecten te verwijderen
- Flask RESTful API verzoekparametervalidatie met Marshmallow-schema's