问题背景:
现在有一个已经打包好了的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
其中参考的官方文档:
较老的方法:
jSetting the timezone - Alpine Linux
较新的方法:
Alpine setup scripts - Alpine Linux
如果是centos系统更改时区: