Problemi di sincronizzazione dell'orologio su Docker per mac

In questi giorni sto lavorando ad un progetto in cui è stato richiesto di implementare un integrazione con le API di Binance (per chi non lo sapesse è un exchange di criptovalute).

Siccome tramite queste API è possibile effettuare compra-vendita di criptovalute la sicurezza è fondamentale e tra le varie misure di protezione è prevista una validazione sul timestamp della richiesta. In breve, se una richiesta non arriva entro una certa finestra temporale (a causa delle cattive condizioni della rete o a causa di attività fraudolente) questa viene immediatamente scartata.

Era quasi l'ora di pranzo quando finisco di scrivere il codice necessario a fare le richieste verso l'API di Binance e quindi decido di effettuare un paio di prove per verificare che tutto funzionasse correttamente. Soddisfatto del codice scritto chiudo lo schermo del mio mac book e vado a mangiare.
Al termine della pausa riprendo a lavorare e, con mia grande sorpresa, mi accorgo che il codice che avevo scritto non funzionava più. Ad ogni richiesta inviata l'API mi restituiva un errore sulla validazione del timestamp delle richieste.
Investigando le cause del problema mi sono accorto che l'orario riportato dal container era più avanti di qualche secondo rispetto all'orologio del mac (a parte per la differenza di 2 ore dovuta al fuso orario).
L'orologio del container è qualche secondo più avanti di quello del mac
In pratica, facendo anche altre prove, mi sono accorto che ogni volta che il mac va in sospensione quando poi il sistema operativo riprende l'esecuzione di docker introduce un piccolo sfasamento dell'orologio di sistema.

Soluzione

Per risolvere questo problema basta che ogni volta che riprendo a lavorare dopo che il mac è andato in sospensione mi ricordi di sincronizzare l'orologio di Docker con quello del mac tramite questo comando:

docker run --rm --privileged alpine hwclock -s

Questo comando si occupa di avviare un container con alpine linux in modalità privilegiata (cioè con accesso ai device del sistema host) e di forzare una sincronizzazione dell'orologio di Docker con quello hardware del mac.

Commenti