目录
- 问题描述
- 问题分析
- 解决方案
- 容器时区验证
问题描述
使用下面的 Dockerfile 为 youlai-boot 项目制作镜像设置容器时区报错。
# 基础镜像
FROM openjdk:17-jdk-alpine
# 时区修改
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone
报错信息如下:
cp: can't stat '/usr/share/zoneinfo/Asia/Shanghai': No such file or directory
问题分析
因为基础镜像使用的是 openjdk:17-jdk-alpine
Alpine 是一个基于 musl libc 和 BusyBox 工具箱的轻量级 Linux 发行版。它被设计为尽可能简单和轻巧,以适应资源受限的环境,如容器。
Alpine基 础镜像中默认情况下可能不包含 tzdata 包,这可能导致在使用 /usr/share/zoneinfo/ 路径时出现问题。所以,你需要确保在 Alpine Linux 中安装了 tzdata 包,以便能够使用正确的时区信息。
解决方案
在设置时区前先安装 tzdata 包,具体是将下面错误的配置改成正确的配置。
- 错误的
# 基础镜像
FROM openjdk:17-jdk-alpine
# 时区修改
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone
- 正确的
# 基础镜像
FROM openjdk:17-jdk-alpine
# 时区修改
RUN \# 安装 tzdata 包设置时区apk --no-cache add tzdata && \# 复制 Asia/Shanghai 时区信息到 /etc/localtimecp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone
容器时区验证
成功制作镜像且容器运行成功的时候,接下来验证容器的时区是否是上文所设置的 Asia/Shanghai
,具体步骤如下:
docker exec -it youlai-boot shcat /etc/timezone
成功截图如下: