Docker容器与主机不同步

3
我有一个简单的Node应用程序,可以向AWS SQS发送消息。在本地开发中,我使用regionqueueUrlaccessKeyIdsecretAccessKey提供AWS SDK。
一切正常,直到我将应用程序docker化并作为容器运行时。然后每当SQS想要执行某些操作时,我会收到以下错误消息: { SignatureDoesNotMatch: Signature expired: 20161211T132303Z is now earlier than 20161211T142227Z (20161211T143727Z - 15 min.)} 如果我添加correctClockSkew: true,它就可以解决问题。
那么,Docker是如何要求correctClockSkew: true,而在MacOS上运行Node时却不需要呢?
Node应用程序
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

这是一个Docker命令,用于在后台运行指定镜像。其中“user/image”是指要运行的镜像名称。

编辑

我最初创建这个问题是因为我一直收到AWS不正确的时间错误,现在我在ElasticSearch中也遇到了这个问题。为什么我的容器始终与主机相差约15分钟?
1个回答

4

Docker在Windows和MacOS上运行在虚拟机中,该虚拟机的时钟可能会与您笔记本电脑的操作系统的时钟不同步。我看到了很多解决方案,大多数是一次性命令,包括:

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

这个答案中,有以下内容:

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

我见过的最好解决方案是在特权模式下运行一个ntp容器,这样它可以不断地调整您的docker主机时间:

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

请参阅Docker Hub仓库了解更多详情:https://hub.docker.com/r/tutum/ntpd/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接