1. 問題
在使用 Docker 創建的 Ubuntu 容器中,偶然查看新建文件的時間和宿主機系統時間差了有8個小時,
2. 解決方案
根據經驗,判斷是時區沒有選擇對,運行命令 data -R 發現,果然如此。
root@5a4f037d5c3d:~# date -R Thu, 31 Mar 2022 01:39:49 +0000
+0000 代表就是當前系統為0時區。
由於Ubuntu容器中沒有界面,不能圖形化修改時區,查找資料可以使用 tzselect 命令修改時區。
執行 tzselet 如下:
root@5a4f037d5c3d:~# tzselect /usr/bin/tzselect: line 180: /usr/share/zoneinfo/iso3166.tab: No such file or directory /usr/bin/tzselect: time zone files are not set up correctly
看來是缺少了時區文件,那么時區文件從哪兒來呢?
再次查找資料,發現可以通過 apt install tzdata 進行安裝時區,有很多時區可供選擇。
但是,如果不想要使用那么多的時區怎么辦呢,再次查找資料找到了一個簡單的,不需要在docker中安裝 tzdata 的方式。
就是直接拷貝需要的時區數據,再進行軟鏈接就可以了。執行命令如下:
# step1. 進入容器中 創建文件夾 # 注意:只有運行時候 docker run -dit 的容器才可以進入容器的shell操作 docker exec -it test bash # 由於沒有安裝tzdata的系統沒有這個文件夾 需要創建 # -p 因為沒有zoneinfo父路徑,所以需要同時創建父子路徑 mkdir -p /usr/share/zoneinfo/Asia # step2. 宿主機中拷貝時區文件到容器中 # test 是筆者測試用的容器名 # 筆者需要的東八區上海的時區文件,如果需要其他的可以相應改動 docker cp /usr/share/zoneinfo/Asia/Shanghai test:/usr/share/zoneinfo/Asia/Shanghai # step3. 再次進入容器 執行軟鏈接創建 docker exec -it test bash ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # step4. 驗證 root@5a4f037d5c3d:~# date -R Thu, 31 Mar 2022 09:58:32 +0800
值得一提的是,筆者的宿主機是ubuntu系統,所以可以直接拷貝。如果是windows系統,建議從其他地方拷貝,或者 apt install tzdata --no-install-recommends 先安裝,再 apt remove tzdata 卸載。
--no-install-recommends 是為了最小化安裝,不安裝不必要的包。
3. 參考文獻
[1]. 在自動化運維中設置apt-get install tzdata的noninteractive方法_易生一世的博客-CSDN博客_tzdata安裝