Docker 容器与主机不同步

Posted

技术标签:

【中文标题】Docker 容器与主机不同步【英文标题】:Docker container out of sync with host 【发布时间】:2017-04-26 12:29:25 【问题描述】:

我有一个向 AWS SQS 发送消息的简单节点应用程序。对于本地开发,我为 AWS SDK 提供regionqueueUrlaccessKeyIdsecretAccessKey

在我将应用程序 dockerise 并作为容器运行之前,一切正常。然后每当 SQS 想做某事时,我都会收到以下错误

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

如果我添加correctClockSkew: true,它会解决问题。

docker 做什么来要求correctClockSkew: true 但在 MacOS 中运行 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

编辑

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

【问题讨论】:

【参考方案1】:

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)

来自this answer 有:

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/

【讨论】:

以上是关于Docker 容器与主机不同步的主要内容,如果未能解决你的问题,请参考以下文章

有啥好的办法解决 docker 容器与宿主机时间不同步的问题

解决Docker容器时区及时间不同步问题

Docker容器与宿主机时间同步解决方案

解决Docker容器和宿主机时间同步问题

Docker容器学习梳理-容器时间跟宿主机时间同步

在 Docker 容器中安装 node_modules 并与主机同步