docker 已经打包好镜像后如何修改时区

问题背景:

现在有一个已经打包好了的tar镜像文件,我需要在不重新用dockerfile构建的情况下修改好里面的时区,并且再次打包使用。

因为其实在内网环境下,通过基础镜像的时区来对齐是较为常见的。在构建时无法去获取那些时区包,或者把那些包丢到本地,较为麻烦。

解决思路:

一,看版本

不能盲目的尝试,需要知道你当前的linux版本

cat /etc/issue

我的是

然后需要根据你的linux版本去选择对应的调整时区的方法,说真的我一开始不知道linux,还想着根据centos或者ubuntu的方式来,然后想着使用centOS调整时区常用的timedatectl等工具,结果yum,apt了一下发现都用不了,才想到去查linux版本。。

二、改时区

1,在dockerfile里面更改,然后重新构建

因为问题背景,所以不考虑,但是因为其实改docker和在run后改,只是步骤上的差别,可以参考了之后实施。

2,在run后修改

这里构建时都需要添加tzdata包后做操作,这种东西直接参考官方文档是最佳的。

添加TZ环境变量的方法

#先创建run起来并且添加环境变量
docker run -e TZ=Asia/Shanghai -dit xxx:xxx
#进入镜像的shell
docker exec -it jolly_cerf  sh
#安装时区包
apk add tzdata
#退出
exit
#复制外部的时区文件
docker cp /usr/share/zoneinfo/Asia/Shanghai jolly_cerf:/etc/localtime
#
docker exec -it jolly_cerf  sh
#调整时区
echo ${TZ} > /etc/timezone
#已经成功转换
date

这种方法的结果,在删除tzdata包时会回退

将该镜像打包后,上传顶替原有镜像,然后不做任何操作创建容器,发现时间是对的,完成效果。

不添加环境变量的方法

dockerfile如下:

FROM alpine AS runtime
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo Asia/Shanghai > /etc/timezone && apk del tzdata

从dockerfile改成命令复现的,没成功

官方文档推荐方法

dockerfile如下:

FROM alpine AS runtime
ENV TZ Asia/Shanghai
RUN apk add alpine-conf && \
    /sbin/setup-timezone -z Asia/Shanghai && \
    apk del alpine-conf

我没配环境变量使用命令行,失败了。之后有空再试吧 

其他操作记录一下

# 上传镜像
docker load -i xxx.tar
# 查看现有镜像
docker images
# 查看现在在运行的容器
docker ps
# 查看所有的容器,包括exit的
docker ps -a
# 暂停,删除
docker stop xxx
docker rm xxx
#提交镜像到自己的镜像库 -a 是镜像的名字 obxxx 这个是docker生成容器时产生的随机名
docker commit -a "xxx" objective_shannon xxx:v6.0.4_0516
#保存镜像 -o 表示输出的文件
docker save -o xxx.tar xxx:v6.0.4_0516

reference:

效果是参考这位大佬的dockerfile来实现的:

https://www.cnblogs.com/flipped/p/15808681.html

其中参考的官方文档:

较老的方法:

j​​​​​​Setting the timezone - Alpine Linux

较新的方法: 

​​​​​​Alpine setup scripts - Alpine Linux

如果是centos系统更改时区:

https://blog.csdn.net/skh2015java/article/details/85007624