当前位置: 首页 > 面试题库 >

Docker容器中与主机同步的时间

万俟炯
2023-03-14
问题内容

我正在尝试CosmosDB通过我的SpringBoot应用进行连接。如果我通过Spring或通过运行应用程序,则所有这些工作都可以进行Intellij。但是,当我在其中运行应用程序时,Docker出现以下错误消息:

com.azure.data.cosmos.CosmosClientException: The authorization token is not valid at the current time.
Please create another token and retry
(token start time: Thu, 26 Mar 2020 04:32:10 GMT, 
token expiry time: Thu, 26 Mar 2020 04:47:10 GMT, current server time: Tue, 31 Mar 2020 20:12:42 GMT).

请注意,在以上错误消息current server time中正确,但其他时间晚了5天。

我发现有趣的是,我只在docker容器中收到过此消息。

FROM {copy of zulu-jdk11}

ARG JAR_FILE

#.crt file in the same folder as your Dockerfile
ARG CERT="cosmos.cer"
ARG ALIAS="cosmos2"

#import cert into java
COPY $CERT /
RUN chmod +x /$CERT
WORKDIR $JAVA_HOME/lib/security
RUN keytool -importcert -file /$CERT -alias $ALIAS -cacerts -storepass changeit -noprompt

WORKDIR /
COPY /target/${JAR_FILE} app.jar
COPY run-java.sh /
RUN chmod +x /run-java.sh

ENV JAVA_OPTIONS "-Duser.timezone=UTC"
ENV JAVA_APP_JAR "/app.jar"

# run as non-root to mitigate some security risks
RUN addgroup -S pcc && adduser -S nonroot -G nonroot
USER nonroot:nonroot

ENTRYPOINT ["/run-java.sh"]

需要注意的一件事是,ENV JAVA_OPTIONS "-Duser.timezone=UTC"但是删除它根本没有帮助我

我基本上从IntelliJ运行相同的步骤,但没有问题,但是在docker中,到期日期似乎要晚5天。

version: "3.7"
services:
  orchestration-agent:
    image: {image-name}
    ports:
      - "8080:8080"
    network_mode: host
    environment:
      - COSMOSDB_URI=https://host.docker.internal:8081/
      - COSMOSDB_KEY={key}
      - COSMOSDB_DATABASE={database}
      - COSMOSDB_POPULATEQUERYMETRICS=true
      - COSMOSDB_ITEMLEVELTTL=60

我想这也应该提到的是我改变了network_modehost。而且我还将CosmosDB
URI从更改https://localhost:8081https://host.docker.internal:8081/

我还要提及的是,我dockerfile是借助以下方法构建的:

服务无法识别将自签名证书导入Docker的JRE
cacert

如何在Dockerfile中为LDAPS向Jenkins添加SSL自签名证书?


问题答案:

Docker容器不维护单独的时钟,它与Linux主机相同,因为时间不是命名空间值。这也是Docker删除更改容器内时间的权限的原因,因为这会影响主机和其他容器,从而破坏隔离模型。

但是,在Docker桌面上,docker在VM内部运行(允许您在非Linux桌面上运行Linux容器),并且在笔记本电脑挂起时,VM的时间可能会不同步。当前正在github上的一个问题中对此进行跟踪,您可以按照该问题查看进度:https : //github.com/docker/for-
win/issues/4526

可能的解决方案包括重新启动计算机,重新启动Docker的VM,将NTP作为特权容器运行或使用以下PowerShell在Windows VM中重置时间同步

Get-VMIntegrationService -VMName DockerDesktopVM -Name "Time Synchronization" | Disable-VMIntegrationService
Get-VMIntegrationService -VMName DockerDesktopVM -Name "Time Synchronization" | Enable-VMIntegrationService

使用WSL 2,重新启动VM涉及:

wsl --shutdown
wsl


 类似资料:
  • -v /root/mysql/conf:/etc/mysql 上面命令可以将宿主机目录挂载到容器中,当容器目录不为空时,宿主机目录下的文件会覆盖了容器目录中的文件。 如果我现在宿主机没有配置文件,/root/mysql/conf 是空。 我想把容器中默认的配置映射出来,效果是容器启动后,/root/mysql/conf 目录下出现了容器 /etc/mysql 目录下的内容,如何实现。 -v mys

  • 问题内容: 我找不到这个问题的直接答案,但是这里是: 假设我有一台主机,最多可打开1024个文件: 和在该主机中运行的docker容器,其中包含: 如果我尝试打开1024个以上的文件,那么容器中会有问题吗?我认为在这种情况下,容器的实际限制将是1024个文件。你怎么看? 问题答案: 虽然有点晚,但我只想清除对ulimit差异的怀疑。 如果在运行容器时确实设置了该值,则容器内显示的ulimit值来自

  • 问题内容: 我在Docker容器中安装并将其与主机同步时遇到问题。我的Docker版本是,而Docker Compose版本是。 我的样子是: 我的: 该应用程序运行良好。源代码已同步。热装也很棒。 我唯一的问题是主机上的文件夹为空。是否可以将Docker容器中的文件夹与主机同步? 另外,我已经找到了此博客文章。作者试图解决我面临的同样问题。问题是,由于我们只是将它们从Docker容器复制到主机,

  • 我现在很困惑。我尝试了很多我可以在网上找到的东西,但是,没有一个解决它。我使用WSL2安装了Win10和Docker desktop来托管Linux容器。我使用以下命令启动詹金斯网站。 这个很管用。我可以使用访问网站 谢谢你 编辑:只是想解释一下我做了什么来解决我的问题。创建network是我最初所做的,但由于我卷曲网页的方式错误,所以失败了。我做只是为了便于在上定位我的容器。但是,正如我的问题中

  • 问题内容: 我在Linode服务器上运行了docker。有时,我看到码头上的时间不正确。目前,我已经在每个docker中更改了运行脚本,以包括以下代码行。 但是,我理想地希望做的是docker应该与主机同步时间。有没有办法做到这一点? 问题答案: 该答案的来源是对该答案的注释:docker容器会自动与主机同步时间吗? 查看答案后,我意识到docker容器上不会发生时钟漂移。Docker使用与主机相

  • 问题内容: 我找不到将Docker运行容器从一台主机移动到另一台主机的方法。 有什么办法可以像将图像一样将容器推入存储库吗?当前,我不使用数据卷来存储与在容器内运行的应用程序关联的数据。因此,一些数据驻留在容器内,我想在重新设计设置之前将其保留。 问题答案: 您无法将正在运行的Docker容器从一台主机移动到另一台主机。 您可以使用将容器中的更改提交到映像,将映像移到新主机上,然后使用启动新容器。