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)

https://blog.csdn.net/qq_44940576/article/details/116264461

(29条消息) 修改docker时区_哎幽的成长-CSDN博客_docker tz

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐