docker - 时间不对

本文讲述了在Java应用运行于Docker容器时,如何处理时区配置问题。当-Duser.timezone未设置时,程序会尝试从运行平台(如Linux)获取时区信息。在CentOS系统中,时区信息是通过软链接指向/usr/share/zoneinfo/Asia/Shanghai。作者发现其Ubuntu宿主机的/etc/localtime也是软链接,但Docker容器内并未正确继承。解决方法是通过Dockerfile挂载真实的时区文件,并设置时区环境变量TZ为Asia/Shanghai,确保容器内时区正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java显示通过用户的配置 user.timezone 作为时区信息的, 如果user.timezone 没有配置就会获取运行平台(linux)的配置的Zone ID作为时区信息的,如果最后程序还是没有获取到时区信息 就会使用GMT时间作为最后的时区信息(就是使用GMT+0)作为最后的时区信息。

这篇文章中推荐解决办法是在增加-Duser.timezone=Asia/Shanghai启动参数来解决问题。 这是一种方案。

但是我还是没有弄明白我之前的解决方案为何不行, 因为我的解决方法应该符合java获取时区的第二种方式的。 最后我还是在这篇文章中找到原因,文章中说的centos的系统的/etc/localtime文件是使用软连接的方式指向 /usr/share/zoneinfo/Asia/Shanghai的。所以centos的时区就是Asia/Shanghai。 于是我就怀疑我的宿主机(ubuntu)也是使用的软连接的方式, 于是我运行命令:
发现确实如此啊, 我使用docker的-v 挂载的/etc/localtime 实际上只是宿主机的一个软连接,所以容器中得时区不对
解决办法: 将真实的宿主机的时区文件挂载到容器的时区文件中就可以解决时区不对的问题
下面是我的Dockerfile文件和启动命令:

FROM adoptopenjdk:11-jre-hotspot

# 设置容器的时区
RUN mkdir /opt/app   
ADD xSpider-1.0-SNAPSHOT   /opt/app/spider

EXPOSE 8443
VOLUME /log
VOLUME /home/ubuntu/mzitu
# 挂载时区的目录
VOLUME /usr/share/zoneinfo

# 设置时区为上海
ENV TZ=Asia/Shanghai
# 设置时区信息
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 启动程序的脚本
ENTRYPOINT ["/opt/app/spider/bin/xSpider"]

转自:

https://blog.youkuaiyun.com/leisurelen/article/details/106868962

Windows PowerShell 版权所有(C) Microsoft Corporation。保留所有权利。 安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows PS C:\Windows\system32> wsl --shutdown PS C:\Windows\system32> wsl --export docker-desktop-data D:\docker\docker-desktop-data.tar 不存在具有所提供名称的分发。 错误代码: Wsl/Service/WSL_E_DISTRO_NOT_FOUND PS C:\Windows\system32> # 查看所有WSL分发版 >> wsl -l -v NAME STATE VERSION * Ubuntu Stopped 2 docker-desktop Stopped 2 PS C:\Windows\system32> wsl --shutdown PS C:\Windows\system32> # 强制删除残留配置(谨慎操作) >> wsl --unregister docker-desktop >> wsl --unregister docker-desktop-data >> >> # 重启Docker Desktop >> Start-Process 'C:\Program Files\Docker\Docker\Docker Desktop.exe' 正在注销。 操作成功完成。 正在注销。 不存在具有所提供名称的分发。 错误代码: Wsl/Service/WSL_E_DISTRO_NOT_FOUND PS C:\Windows\system32> [wsl2] >> kernelCommandLine = sysctl vm 找不到类型 [wsl2]。 所在位置 行:1 字符: 1 + [wsl2] + ~~~~~~ + CategoryInfo : InvalidOperation: (wsl2:TypeName) [],RuntimeException + FullyQualifiedErrorId : TypeNotFound kernelCommandLine : 无法将“kernelCommandLine”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如 果包括路径,请确保路径正确,然后再试一次。 所在位置 行:2 字符: 1 + kernelCommandLine = sysctl vm + ~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (kernelCommandLine:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PS C:\Windows\system32>
03-08
<think>嗯,用户之前已经问过如何将Docker安装迁移到D盘,现在遇到了问题。他们在执行迁移步骤时遇到了错误,比如“不存在具有所提供名称的分发”以及配置wslconfig时的错误。我需要仔细看看他们的操作步骤哪里出错了。 首先,用户按照之前的指南操作,执行了wsl --export,但系统提示找不到分发版。可能他们在导出docker-desktop-data之前没有正确停止相关服务,或者分发版名称不对。接着用户检查了现有的WSL分发版,发现只有Ubuntudocker-desktop,但没有docker-desktop-data,这可能是因为在之前的步骤中已经注销或者从未正确安装过。 用户尝试强制删除docker-desktop和docker-desktop-data,但再次遇到错误。之后用户尝试启动Docker Desktop,但可能因为WSL配置被删除导致无法启动。然后他们试图在PowerShell中直接输入[wsl2]的配置,导致语法错误,因为那应该是在.wslconfig文件中配置的,而不是在命令行直接运行。 我需要解释错误的原因,尤其是为什么docker-desktop-data分发版不存在,可能是因为之前的迁移步骤未完成或者Docker Desktop未正确安装。此外,用户在PowerShell中直接输入了[wsl2]配置,这是错误的,应该指导他们正确编辑配置文件。 还要注意用户可能对WSL和Docker Desktop的关系不太清楚,需要简明扼要地解释,并给出正确的解决步骤,包括重新安装Docker Desktop、正确配置.wslconfig文件,以及迁移后的验证步骤。另外,需要提醒用户谨慎操作强制删除命令,以免导致数据丢失。</think>### 问题诊断与解决方案(Windows PowerShell操作) #### 一、错误原因分析 1. **`WSL_E_DISTRO_NOT_FOUND`** 错误: - Docker Desktop默认创建两个WSL分发版:`docker-desktop`(核心服务)和`docker-desktop-data`(数据存储) - 出现该错误表明系统未检测到`docker-desktop-data`分发版,可能原因: - Docker Desktop未完整安装 - 之前手动删除了WSL分发版 - 系统残留配置冲突 2. **`[wsl2]`配置错误**: - `[wsl2]`相关配置需写入`.wslconfig`文件,而非在PowerShell命令行直接执行 - 错误提示是PowerShell将`[wsl2]`误认为命令导致的语法错误 #### 二、完整修复流程 ##### 步骤1:完全重置Docker环境 ```powershell # 强制删除所有Docker相关分发版 wsl --unregister docker-desktop wsl --unregister docker-desktop-data # 清理残留文件(谨慎操作!) Remove-Item -Recurse -Force $env:LOCALAPPDATA\Docker ``` ##### 步骤2:重新安装Docker Desktop 1. 访问[官网](https://www.docker.com/)下载最新安装包 2. 安装时勾选: - ☑️ Use WSL 2 instead of Hyper-V - ☑️ Add shortcut to desktop ##### 步骤3:验证基础环境 ```powershell # 检查WSL分发版状态 wsl -l -v ``` 正常应显示: ``` NAME STATE VERSION * docker-desktop Running 2 docker-desktop-data Running 2 ``` ##### 步骤4:正确创建.wslconfig文件 1. 使用记事本创建文件:`C:\Users\<你的用户名>\.wslconfig` 2. 写入以下内容(注意文件编码需为UTF-8): ```ini [wsl2] kernelCommandLine = sysctl vm.max_map_count=262144 memory=4GB processors=4 ``` ##### 步骤5:数据迁移操作(修正版) ```powershell # 停止所有WSL实例 wsl --shutdown # 导出数据分发版(等待约2-5分钟) wsl --export docker-desktop-data D:\docker\docker-desktop-data.tar # 注销旧数据分发版 wsl --unregister docker-desktop-data # 导入到新位置(注意路径斜杠方向) wsl --import docker-desktop-data D:\docker\data\ D:\docker\docker-desktop-data.tar --version 2 ``` #### 三、关键注意事项 1. **路径规范**: - 避免使用中文字符和特殊符号 - 示例推荐路径:`D:\docker\` 2. **权限配置**: ```powershell # 授予Everyone完全控制权限 icacls D:\docker\ /grant Everyone:(OI)(CI)F ``` 3. **验证命令**: ```powershell # 检查数据存储位置 docker info --format '{{.DockerRootDir}}' # 预期输出:D:\docker\data\docker-desktop-data\version-pack-data\community ``` #### 四、常见问题补充 1. **若仍报错`WSL_E_DISTRO_NOT_FOUND`**: - 执行 `wsl --update` 更新WSL内核 - 在Windows功能中关闭再重新启用: ```powershell dism.exe /online /disable-feature /featurename:Microsoft-Windows-Subsystem-Linux dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux ``` 2. **性能优化建议**: ```ini # 在.wslconfig中添加: [wsl2] swap=0 localhostForwarding=true ``` > **操作提示**:建议在SSD硬盘上执行迁移操作,机械硬盘可能需要更长时间。若遇到`vhdx`文件锁定问题,可尝试重启后进入安全模式操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值