在 Java 开发中使用 Docker 镜像时,由于 alpine 提供的 linux 环境的镜像特别的小,只有 5M 左右,集成 openjdk 后的大小也在 100M 以内,因此应用非常广泛,在 Docker Hub 有大量基于 alpine 的镜像。

但是所有基于 alpine 的镜像使用的都是默认时区,因此在使用时,要对时区进行修改。

时区地图

​https://www.timeanddate.com/time/map/​

Docker 镜像,基于 alpine 系统的时区配置_mysql

查看日期

首先可以进入 alpine 的镜像(默认 ​​/bin/sh​​)查看日期:

[root@k8s-master openjdk8]# docker run -i -t --rm alpine:3.9
/ # date -R

修改日期

参考:​​https://wiki.alpinelinux.org/wiki/Setting_the_timezone​

先在容器按照上述参考文档,修改查看是否有效。

实验

在前面进入的容器中,按顺序执行下面的命令:

# 安装时区设置
apk add tzdata
# 复制上海时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 指定为上海时区
echo "Asia/Shanghai" > /etc/timezone
# 验证
date -R
# 输出,和当前时间对比
Thu, 14 Feb 2019 14:01:02 +0800
# 删除其他时区配置,节省空间

通过实验发现该方法可行,下面针对镜像(而不是镜像实例)进行修改。

修改

FROM alpine:3.9

# 设置时区为上海
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apk del tzdata

保存为 Dockerfile 文件,在 Dockerfile 目录执行命令构建镜像:

docker build -t alpine-sh:3.9 .

通过上述方式创建后的镜像仍然很少,而且是符合需要的时区。

基于 alpine 的其他镜像的修改

例如 ​​openjdk:8u191-jre-alpine3.9​​ 是一个基于 alpine 的镜像。

openjdk:8u191-jre-alpine3.9 Dockerfile 地址:
​​​https://github.com/docker-library/openjdk/tree/d93be18f4f2d5e8457169cac00e559d953b6028e/8/jre/alpine​

在 ​​openjdk:8u191-jre-alpine3.9​​ 镜像中的时区也存在问题。

修改方式一

下载上面提供的 Dockerfile,稍作修改即可实现时区的定制:

# 使用前面刚刚创建的 alpine-sh:3.9 即可修改时区
FROM alpine-sh:3.9

# 其他不变,全部省略

修改方式二

或者参考前面 alpine 的修改:

FROM openjdk:8u191-jre-alpine3.9

# 设置时区为上海
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone \
&& apk del tzdata

所有基于 ​​alpine​​ 的镜像都可以采用类似的方法进行修改。

其他系统

例如 Docker 官方提供的 mysql

​https://github.com/docker-library/mysql/tree/master/5.6​

可以先进系统看时区,以及是否存在时区的配置文件,存在的情况下,直接修改即可。示例如下:

FROM 10.10.1.243:5000/mysql:5.6.43

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone