Docker修改时区
起因
在本地使用docker拉取了一个sqlserver镜像并启动容器提供sqlserver服务供项目使用,在使用中发现sql中使用getdate()函数后得到的时间与系统中的版本相差八个小时,因为中国时区恰好处于东八区,所以推测是时区问题。
解决方法
通过网上查询得到两种方法,一种是在构建容器时传入 -e TZ=“Asia/Shanghai” 参数可以指定docker容器的时区,另外一种方法则是进入容器修改时区,因为我这边容器已经构建完成,故选择第二种方法对docker容器的时区进行修改。
在 Linux 系统中,控制时区和时间的主要是两个地方:
- /etc/timezone
主要代表当前时区设置,一般链接指向
/usr/share/zoneinfo目录下的具体时区。 /etc/localtime
主要代表当前时区设置下的本地时间。
因此我们需要修改两个地方的文件。
首先使用docker ps命令查询所有可用的容器
zhaochunhui@zhaochunhuideMacBook-Pro % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
366ba4ab6f02 mcr.microsoft.com/mssql/server:2017-latest "/opt/mssql/bin/nonr…" 2 weeks ago Up 2 minutes 0.0.0.0:1433->1433/tcp tender_saha
根绝上面得到的容器id号进入容器
zhaochunhui@zhaochunhuideMacBook-Pro % docker exec -it 366ba4ab6f02 bash
进入容器内部后可以先进入/etc目录,查看一下目录下的文件
root@366ba4ab6f02:/# cd /etc
root@366ba4ab6f02:/etc# ls
ODBCDataSources host.conf magic.mime rc4.d
X11 hostname mailcap rc5.d
adduser.conf hosts mailcap.order rc6.d
alternatives init mime.types rcS.d
apt init.d mke2fs.conf resolv.conf
bash.bashrc inputrc modules-load.d rmt
bash_completion.d insserv mtab securetty
bindresvport.blacklist insserv.conf networks security
binfmt.d insserv.conf.d nsswitch.conf selinux
ca-certificates issue odbc.ini sgml
ca-certificates.conf issue.net odbcinst.ini shadow
cron.daily kernel opt shells
cron.weekly ld.so.cache os-release skel
dbus-1 ld.so.conf pam.conf ssl
debconf.conf ld.so.conf.d pam.d subgid
debian_version ldap passwd subuid
default legal profile sysctl.conf
deluser.conf libaudit.conf profile.d sysctl.d
dhcp locale.alias python systemd
dpkg locale.gen python2.7 terminfo
environment localtime python3 timezone
fstab logcheck python3.5 tmpfiles.d
gai.conf login.defs rc.local udev
gdb logrotate.d rc0.d update-motd.d
group lsb-release rc1.d wgetrc
gshadow machine-id rc2.d xdg
gss magic rc3.d xml
可以看到timezone和localtime文件都在此文件夹下
使用cat命令查看一下timezone中设置的时区:
root@366ba4ab6f02:/etc# cat timezone
Etc/UTC
不出所料果然为UTC时区,即0时区,使用以下命令修改timezone中设置的时区
root@366ba4ab6f02:/etc# echo "Asia/Shanghai" > /etc/timezone
再更改localtime文件内容:
root@366ba4ab6f02:/etc# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
其中/usr/share/zoneinfo/Asia/Shanghai为我们宿主机上的文件
退出容器后重启容器
root@366ba4ab6f02:/etc# exit
exit
zhaochunhui@zhaochunhuideMacBook-Pro /etc % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
366ba4ab6f02 mcr.microsoft.com/mssql/server:2017-latest "/opt/mssql/bin/nonr…" 2 weeks ago Up 3 minutes 0.0.0.0:1433->1433/tcp tender_saha
zhaochunhui@zhaochunhuideMacBook-Pro /etc % docker restart 366ba4ab6f02
这时再在sqlserver中使用getdate()函数就能获取正常时间了。
参考文章:Docker 时区调整方案 – 云+社区 – 腾讯云 (tencent.com)