云原生之容器编排实践-Docker使用JDK-Alpine镜像的时区问题导致定时任务不执行

简介: 云原生之容器编排实践-Docker使用JDK-Alpine镜像的时区问题导致定时任务不执行

9{$RSQC}JWITIOT]J`BRUXT.png

背景


偶然发现程序中的一个定时任务在 Docker 容器中部署后并没有按照既定的时间执行。经过排查后发现,定时任务与实际时间有关联,而容器内(openjdk:8-jdk-alpine)的时间与实际时间相差了8小时,应该是时区问题。


那么,如何解决容器内的时区问题呢?网上有给出各类方式解决这个问题,而且针对了不同的操作系统的镜像都给出了方案。我这里用的是比较简单的 JDK-Alpine 镜像,参考其官方文档后,直接在构建自己的镜像时设置好时区。


设置时区


根据 Alpine 的文档提示:docs.alpinelinux.org/user-handbo…Dockerfile 中:

T01KDHHZ%L2EVF~RTFD)}CU.png


RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    apk del tzdata && \
    rm -rf /var/cache/apk/*

完整Dockfile


FROM openjdk:8-jdk-alpine
RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    apk del tzdata && \
    rm -rf /var/cache/apk/*
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

Reference


后记


一开始安装启动 minikube 时报错,原因之一是说操作系统的内核版本不支持。。其实,后来我指定了 Kubernetes 的版本就可以了,也就没有用到升级后的内核: minikube start --force --kubernetes-version=v1.23.1 。这里记录下 CentOS7 升级内核版本的操作。

升级前的 CentOS7 升级内核版本信息如下:


# 系统版本信息
[root@k8s1 local]# uname -a
Linux k8s1 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
# 内核版本信息
[root@k8s0 ~]# uname -r
3.10.0-1127.el7.x86_64

升级内核版本


[root@k8s1 local]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
获取http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
警告:/var/tmp/rpm-tmp.wEC7Ex: 头V4 DSA/SHA1 Signature, 密钥 ID baadae52: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:elrepo-release-7.0-3.el7.elrepo  ################################# [100%]
[root@k8s1 local]# yum --enablerepo=elrepo-kernel install -y kernel-lt
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * elrepo-kernel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
elrepo                                                                                                                              | 3.0 kB  00:00:00     
elrepo-kernel                                                                                                                       | 3.0 kB  00:00:00     
(1/2): elrepo/primary_db                                                                                                            | 388 kB  00:00:00     
(2/2): elrepo-kernel/primary_db                                                                                                     | 2.1 MB  00:00:01     
正在解决依赖关系
--> 正在检查事务
---> 软件包 kernel-lt.x86_64.0.5.4.207-1.el7.elrepo 将被 安装
--> 解决依赖关系完成
依赖关系解决
=============================================================================================================================
 Package                           架构                           版本                                         源                                     大小
=============================================================================================================================
正在安装:
 kernel-lt                         x86_64                         5.4.207-1.el7.elrepo                         elrepo-kernel                          50 M
事务概要
=============================================================================================================================
安装  1 软件包
总下载量:50 M
安装大小:227 M
Downloading packages:
警告:/var/cache/yum/x86_64/7/elrepo-kernel/packages/kernel-lt-5.4.207-1.el7.elrepo.x86_64.rpm: 头V4 DSA/SHA256 Signature, 密钥 ID baadae52: NOKEY0:00 ETA 
kernel-lt-5.4.207-1.el7.elrepo.x86_64.rpm 的公钥尚未安装
kernel-lt-5.4.207-1.el7.elrepo.x86_64.rpm                                                                                           |  50 MB  00:00:11     
从 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org 检索密钥
导入 GPG key 0xBAADAE52:
 用户ID     : "elrepo.org (RPM Signing Key for elrepo.org) <secure@elrepo.org>"
 指纹       : 96c0 104f 6315 4731 1e0b b1ae 309b c305 baad ae52
 软件包     : elrepo-release-7.0-3.el7.elrepo.noarch (installed)
 来自       : /etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告:RPM 数据库已被非 yum 程序修改。
  正在安装    : kernel-lt-5.4.207-1.el7.elrepo.x86_64                                                                                                  1/1 
  验证中      : kernel-lt-5.4.207-1.el7.elrepo.x86_64                                                                                                  1/1 
已安装:
  kernel-lt.x86_64 0:5.4.207-1.el7.elrepo                                                                                                                  
完毕!

设置默认内核


先查看内核默认启动顺序,然后设置默认内核。


# 查看内核默认启动顺序
[root@k8s1 local]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg 
CentOS Linux (5.4.207-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-37761db4ce554629afd046b89323275e) 7 (Core)
# 默认启动的顺序是从0开始,新内核是从头插入(而5.4.207的位置是在0),所以需要选择0
[root@k8s1 local]# grub2-set-default 0

验证内核版本


Note:需要reboot重启生效。


# 重启前
[root@k8s1 local]# uname -r
3.10.0-1127.el7.x86_64
# 需要reboot重启生效
[root@k8s1 local]# reboot
# 重启后
[root@k8s1 ~]# uname -r
5.4.207-1.el7.elrepo.x86_64

If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
云效flow构建docker镜像更换apt源为阿里镜像源
在 Dockerfile 中添加命令以更换 Debian 源为阿里云镜像,加速容器内软件包下载。核心命令通过 `sed` 实现源地址替换,并更新 apt 软件源。其中 `cat` 命令用于验证替换是否成功,实际使用中可删除该行。
581 32
将应用程序打包成Docker镜像时可能遇到哪些问题?
将应用程序打包成Docker镜像时可能遇到哪些问题?
227 77
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
53 0
Docker网关冲突导致容器启动网络异常解决方案
当执行`docker-compose up`命令时,服务器网络可能因Docker创建新网桥导致IP段冲突而中断。原因是Docker默认的docker0网卡(172.17.0.1/16)与宿主机网络地址段重叠,引发路由异常。解决方法为修改docker0地址段,通过配置`/etc/docker/daemon.json`调整为非冲突段(如192.168.200.1/24),并重启服务。同时,在`docker-compose.yml`中指定网络模式为`bridge`,最后通过检查docker0地址、网络接口列表及测试容器启动验证修复效果。
【赵渝强老师】数据库不适合Docker容器化部署的原因
本文介绍了在Docker中部署MySQL数据库并实现数据持久化的方法,同时分析了数据库不适合容器化的原因。通过具体步骤演示如何拉取镜像、创建持久化目录及启动容器,确保数据安全存储。然而,由于数据安全性、硬件资源争用、网络带宽限制及额外隔离层等问题,数据库服务并不完全适合Docker容器化部署。文中还提到数据库一旦部署通常无需频繁升级,与Docker易于重构和重新部署的特点不符。
195 19
【赵渝强老师】数据库不适合Docker容器化部署的原因
在Docker容器中部署GitLab服务器的步骤(面向Ubuntu 16.04)
现在,你已经成功地在Docker上部署了GitLab。这就是我们在星际中的壮举,轻松如同土豆一样简单!星际旅行结束,靠岸,打开舱门,迎接全新的代码时代。Prepare to code, astronaut!
64 12
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等