Docker 容器时区保持为 UTC

标签 docker docker-compose timezone

我一直在努力设置我的 ms-sql docker 容器以使用 Linux 主机日期时间设置。我正在使用 docker-compose 文件,在大多数情况下,解决方案似乎是像这样映射卷(引用:BobcaresSO):

volume:
  - /etc/timezone:/etc/timezone:ro
  - /etc/localtime:/etc/localtime:ro

乍一看,这看起来不错。我可以检查容器认为是什么日期,它反射(reflect)了主机本地时区。但是,SQL 实例仍然显示 GetDate() 的 UTC 时间。

虽然在容器中有一个符号链接(symbolic link),它总是看起来像这样:localtime ->/usr/share/zoneinfo/Etc/UTC。这不是我基于卷映射所期望的,因为它不同于主机 localtime -> ../usr/share/zoneinfo/Australia/Sydney。我可以在容器内手动更新此链接,SQL 上的 GetDate() 返回正确的本地日期时间。正如预期的那样,docker-compose down 上的所有内容都丢失了。

我需要它在容器重启后保持不变,并且我想在部署到多个时区时使用 docker-compose 文件中的卷来处理时区。我确定问题出在我的新手 linux 技能上,很高兴获得有关如何改进它的建议。如何解决符号链接(symbolic link)问题(如果这确实是问题的根本原因)?

主机是:Ubuntu 20.04.1 LTS (Focal Fossa) ms-sql 图像是:mcr.microsoft.com/mssql/server:2019-latest

最佳答案

我一直在寻找,我在 this post 中找到了答案.

我需要的完整步骤:

  • 设置主机时区
  • 将 TZ 环境变量添加到 docker-compose.yml
  • 将主机时区的卷映射添加到 docker-compose.yml

我的 ms-sql 的 docker-conpose 部分现在看起来像这样(为简洁起见省略了一些部分):

ms-sql-server:
image: damo/sqlexpress:1.0.1
ports: 
  - "14333:1433"
volumes: 
  - sqldata:/var/opt/mssql
  - /etc/timezone:/etc/timezone:ro
  - /etc/localtime:/etc/localtime:ro
restart: unless-stopped

我需要在部署之间进行的唯一更改是环境变量。

关于Docker 容器时区保持为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67831394/

相关文章:

visual-studio - 在解决方案中存在网站项目时,在Visual Studio中构建DockerCompose项目会出错

javascript - Google表格脚本编辑器: default timezone

sql - 从 "time with time zone"和时区名称中获取 "time without time zone"

docker - 如何在Cypher Neo4j中合并多个WITH和MATCH子句

Docker compose 'scale' 命令未跨多台机器扩展

Azure 应用服务持续部署 Webhook 不起作用

Docker compose 总是创建一个新卷而不是使用命名的卷

c# - 在客户端上显示服务器日期和服务器时间

linux - 在 Linux Mint 19 Tara 上安装 Docker

docker - 如何将 docker-compose 连接到容器网络和本地主机网络