Docker 容器时区仍为 UTC

Dam*_*amo 7 timezone docker docker-compose

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

volume:
  - /etc/timezone:/etc/timezone:ro
  - /etc/localtime:/etc/localtime:ro
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Dam*_*amo 7

我继续寻找,并在这篇文章中找到了答案。

我需要的完整步骤:

  • 设置主机时区
  • 将 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
Run Code Online (Sandbox Code Playgroud)

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


Sae*_*eed 5

就我而言,将其添加到Dockerfile工作中并更改我构建或运行的每个图像:

FROM ubuntu:20.04 # or any other distro
ENV TZ=Asia/Tehran
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
Run Code Online (Sandbox Code Playgroud)