修改Docker容器中的時區的簡便方法


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安裝

[2]. Docker修改容器中的時間 - battor - 博客園


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM