Docker容器与主机不同步

时间:2016-12-11 14:39:38

标签: node.js amazon-web-services docker

我有一个简单的Node应用程序,可以向AWS SQS发送消息。对于本地开发,我向AWS SDK提供namespace AppiumTest { [TestFixture] public class Appium_Test { //public IWebDriver driver; private AppiumDriver<AndroidElement> driver; [SetUp] public void Setup() { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.SetCapability("device", "Android"); capabilities.SetCapability("browserName", "chrome"); capabilities.SetCapability("deviceName", "Huawei Mate 8"); capabilities.SetCapability("platformName", "Android"); capabilities.SetCapability("platformVersion", "6.0"); //For mobile web application driver = new RemoteWebDriver(new Uri("http://127.0.0.1:4723/wd/hub"), capabilities, TimeSpan.FromSeconds(180)); } [Test] public void Browser_Test() { driver.Navigate().GoToUrl("www.github.com"); driver.FindElement(By.ClassName("octicon octicon-three-bars")).Click(); } [TearDown] public void Teardown() { driver.Quit(); } } regionqueueUrlaccessKeyId

一切正常,直到我将应用程序停靠并作为容器运行。然后每当SQS想要做某事我都会得到以下错误

secretAccessKey

如果我添加{ SignatureDoesNotMatch: Signature expired: 20161211T132303Z is now earlier than 20161211T142227Z (20161211T143727Z - 15 min.) ,则可以解决问题。

Docker正在做什么来要求correctClockSkew: true,而不是在MacOS中运行Node时

节点应用

correctClockSkew: true

Dockerfile

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;
});

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

修改

最初我创建了这个问题,因为我不断收到AWS不正确的时间错误,现在我也在使用ElasticSearch。为什么我的容器可靠地与主机不同步约15分钟。

1 个答案:

答案 0 :(得分:2)

Docker在Windows和MacOS上的VM内运行,该VM的时钟可能与笔记本电脑的操作系统的时钟不同步。我已经看到了很多解决方案,其中大部分是关闭命令,包括:

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

来自this answer那里:

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

我见过的最佳解决方案是在Privledged模式下运行ntp容器,以便它可以不断调整docker主机上的时间:

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

有关详细信息,请参阅docker hub repo:https://hub.docker.com/r/tutum/ntpd/