解决 Docker 容器内时区不一致问题(续)

本贴最后更新于 1914 天前,其中的信息可能已经时移世改

问题描述

前文我们通过修改 Dockerfile 修改了容器内的时区和时间,解决了 Java 应用内时差问题,然后 Leader 提出了一个新的问题,就是 FROM java:8 基础镜像的体积太大了,整个镜像构建后大概有 700MB ~ 800MB,这样当我们多个应用频繁发布版本的时候,服务器的磁盘空间也会变得吃紧,能否利用 alpine 制作一个基础镜像。

解决方案

首先想到的就是,Java 应用的人这么多,是否已经有做好的基础镜像供大众使用,于是使用 docker search 命令查询关键字,得出以下结果:

searchalpine.png

可以看到,docker.io/anapsix/alpine-java 镜像是以 alpine 为基础的,使用 Oracle Jave 8 并且集成了 GLIBC 等组件的基础镜像,stars 数量为 420,很符合我们的期待,又去 https://hub.docker.com/ 浏览了一下详细的介绍信息。好的,没毛病,就用它了。

方案落地

操作记录:

  1. 修改 Dockerfile 并启动
FROM anapsix/alpine-java
ADD target/Joine.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 查看指定容器日志
kubectl logs -f --tail=200 -n mynamespace mycontainername
  1. 发现仍有时区问题,此处由于基础镜像不同,不能照搬之前的方式处理,继续优化 Dockerfile
FROM anapsix/alpine-java
ENV TZ Asia/Shanghai
RUN echo "http://mirrors.aliyun.com/alpine/v3.4/main/" > /etc/apk/repositories \
        && apk --no-cache add tzdata zeromq \
        && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
        && echo "${TZ}" > /etc/timezone
ADD target/Joine.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

  1. 优化解释
    alpine 使用 apk 安装,这里先把 apk 安装源仓库更新为阿里云镜像仓库,之后进行 apk 安装 tzdata 时区工具,之后将工具时间和时区更新到系统

完成

再次发布新版本,查看日志,时间已经恢复正常,查看镜像大小,已缩减至 200MB,很大程度上解决了之前镜像体积过大的问题。

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    491 引用 • 917 回帖
  • 时区
    4 引用 • 1 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...