Le conteneur Docker n’est pas synchronisé avec l’hôte

J’ai une application de nœud simple qui envoie des messages à AWS SQS. Pour le développement local, je fournis à AWS SDK avec region , queueUrl , accessKeyId , secretAccessKey .

Tout fonctionne bien jusqu’à ce que je dockerise l’application et l’utilise en tant que conteneur. Ensuite, chaque fois que SQS veut faire quelque chose, l’erreur suivante apparaît

{ SignatureDoesNotMatch: Signature expired: 20161211T132303Z is now earlier than 20161211T142227Z (20161211T143727Z - 15 min.)

Si j’ajoute correctClockSkew: true corrige le problème.

Que fait docker pour demander le correctClockSkew: true mais pas lors de l’exécution de Node sous MacOS

Application de nœud

 process.env.TZ = 'Europe/London'; const AWS = require('aws-sdk'); AWS.config.update({ region: 'eu-west-1', correctClockSkew: true //this has to be set when running inside a docker container? }); const sqs = new AWS.SQS({ apiVersion: '2012-11-05', }); sqs.sendMessage({ QueueUrl: 'https://sqs.eu-west-1.amazonaws.com/522682236448/logback-paddle-prod-errors', MessageBody: 'HelloSQS', }, (err, data) => { if (err) throw err; }); 

Dockerfile

 FROM node RUN mkdir -p /usr/lib/app WORKDIR /usr/lib/app COPY app/ /usr/lib/app/ RUN npm install CMD ["node", "index.js"] 

docker run -d user/image

modifier

A l’origine, j’avais créé la question parce que je continuais à avoir des erreurs de temps incorrect AWS. Maintenant, je la reçois aussi avec ElasticSearch. Pourquoi mon conteneur n’est-il pas synchronisé de manière fiable avec l’hôte d’environ 15 minutes?

Docker s’exécute à l’intérieur d’une machine virtuelle sous Windows et MacOS, et l’horloge de cette machine virtuelle peut ne plus être synchronisée avec celle du système d’exploitation de votre ordinateur portable. J’ai trouvé pas mal de solutions, principalement des commandes uniques, notamment:

 docker run -it --rm --privileged --pid=host debian nsenter -t 1 -m -u -n -i date -u $(date -u +%m%d%H%M%Y) 

Et de cette réponse il y a:

 docker-machine ssh default "sudo date -u $(date -u +%m%d%H%M%Y)" 

La meilleure solution que j’ai vue pour cela consiste à exécuter un conteneur ntp en mode privé afin qu’il puisse constamment ajuster l’heure sur votre hôte docker:

 docker run -d --restart unless-stopped --name ntp --privileged tutum/ntpd 

Voir le référentiel de docker hub pour plus de détails: https://hub.docker.com/r/tutum/ntpd/