文章

Synology NAS-Docker 容器时区设置

众所周知,在构建Docker镜像的规范Dockerfile中,可以添加镜像所需的apt包安装。这会导致在构建 Docker 映像时将 apt 包安装到该映像中。

当您第一次尝试在典型的 Ubuntu 系统中安装 apt 软件包时,系统会以交互方式要求您输入区域和城市,以在 tzdata 设置中设置时区。但是,这会导致 Docker 映像构建失败,因为 Docker 映像构建过程不支持交互式过程。

DEBIAN_FRONTEND 环境变量

因此,要解决这个问题,您可以通过在 Dockerfile 中将DEBIAN_FRONTEND环境变量设置为noninteractive,在构建 Docker 映像时省略要求区域和城市设置时区的操作。

下面是 Dockerfile 的一个简单示例。

1
2
3
4
5
6
7
8
FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y vim git wget rsyslog sudo

# add and so on ..

CMD bash

到目前为止还没有问题。然而,当您开发利用当前时间的软件并使用 API 在源代码中获取当前时间时,问题就出现了。没有设置时区的系统时间以UTC为基础。因此,有可能您使用的软件开发语言的时间相关功能与系统时间处理重叠,导致软件故障。

tzdata 和时区设置

因此,虽然这很烦人,但在创建并附加容器后,您必须使用以下命令单独手动设置时区。当然,您可以在 Docker 容器之外的 Linux 系统上设置容器的时区,但由于我使用 Synology NAS 的 Docker,因此很难找到方法来执行此操作。

1
dpkg-reconfigure tzdata

下面是我设置时区的示例。如果下面文本中的时间是您当地时间,则时区设置正确。

  • Local time is now
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@img:~# dpkg-reconfigure tzdata
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline
Configuring tzdata
------------------
  
Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of cities, representing the
time zones in which they are located.
  
1. Africa   3. Antarctica  5. Arctic Ocean  7. Atlantic Ocean  9. Indian Ocean    11. System V timezones  13. None of the above
2. America  4. Australia   6. Asia          8. Europe          10. Pacific Ocean  12. US
Geographic area: 6
  
Please select the city or region corresponding to your time zone.
  
1. Aden      11. Baku        21. Damascus          31. Hong Kong  41. Kashgar       51. Makassar      61. Pyongyang
2. Singapore      81. Ujung Pandang
...
9. Baghdad   19. Chongqing   29. Hebron            39. Kamchatka  49. Macau         59. Phnom Penh    69. Seoul
10. Tokyo          89. Yekaterinburg
...
Time zone: 69
  
Current default time zone: 'Asia/Seoul'
Local time is now:      Thu Feb  1 23:46:23 KST 2024.
Universal Time is now:  Thu Feb  1 14:46:23 UTC 2024.

本文由作者按照 CC BY 4.0 进行授权