Docker修改容器中的時間


前言

在公司開發時使用 Docker 創建數據庫(SQL Server)的實例十分方便,還原數據庫也只要設置好共享文件夾,在 SQL Server Management Studio 的圖形化界面中選擇數據庫的備份文件即可還原。但在處理與時間有關的業務邏輯時發現有問題,查詢后發現docker容器中的時間使用的是“標准時間”,與“北京時間”相差8小時,因此解決一下問題(順便復習一下 Linux 的一些命令 #滑稽)。

本人使用的是 Windows 10 專業版系統,Docker(之前發現 Docker Toolbox 會有一些問題,比如還原數據庫出錯)。

1. 創建容器

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YOUR_PASSWORD>" ` -p <YOUR_PORT>:1433 --name <YOUR_NAME> -v <HOST_SHARE_DIR>:<DOCKER_SHARE_DIR> -d microsoft/mssql-server-linux 

注意點:

  1. 要運行 SQL Server 的 Docker 鏡像,主機運行內存不能少於2G
  2. 對於 SQL Server 的 Docker 鏡像,密碼不能設置的太簡單,否則容器運行后會直接報錯退出。建議字母、數字、特殊符號,且不少於8位
  3. 使用 -p 設置端口號時,不要與主機已有沖突(這個應該都知道XD)
  4. 使用 -v 設置共享目錄時,即使目錄不存在也沒關系,Docker會自動新建(主機的和容器的都會新建)
  5. 使用 Powershell 時,如果命令一行太長,可以使用 ` 換行

2. 查看時間

首先進入容器

docker exec -it <YOUR_CONTAINER_NAME> /bin/bash 

使用 date 命令查看時間

root@de3281e271c0:/# date
Sat Apr 11 08:21:26 UTC 2020

而我們主機此時的時間為(使用Powershell查看):

PS C:\Users\XXX> GET-DATE
2020年4月11日, 星期六 16:26:10

可以看到相差8個小時

而手動設置時區也不行(正常的話應該會出現選擇時區):

root@de3281e271c0:/# 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


3. 解決

我們此時要做的就是從另一台電腦上拷貝時區文件,放入Docker容器中,並將設置軟鏈接起來。

此處我使用 WinSCP 從雲服務器中拷貝文件(雲服務器中的系統為 CentOS,而 SQL Server 容器中的系統為 Ubuntu,但可以通用)

先查看一下\😃

[root@VM_0_2_centos ~]# file /usr/share/zoneinfo/Asia/Shanghai
/usr/share/zoneinfo/Asia/Shanghai: timezone data, version 2, 2 gmt time flags, 2 std time flags, no leap seconds, 16 transition times, 2 abbreviation chars

為了方便我拷貝到了主機的d盤根目錄下。由於容器中甚至沒有 /usr/share/zoneinfo/Asia/ 文件夾,需要先新建,再復制進去

新建文件夾(在容器的 shell中):

mkdir -p /usr/share/zoneinfo/Asia 

復制(在主機的 Powershell中):

docker cp d:\Shanghai <YOUR_COINTAINER_NAME>:/usr/share/zoneinfo/Asia/Shanghai 

最后建立軟鏈接:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

查看效果

root@de3281e271c0:/# date
Sat Apr 11 16:57:18 CST 2020

結束!

吐槽

新版本的 Docker Desktop 中加入了 Dashboard 功能,可以圖形化的管理已有的容器(開啟、關閉、日志),但其命令行操作實在不給力,按 Tab 鍵無法自動補全,因此還是建議使用 exec -it 的方式執行。

后記

本文新使用了 > 符號來表示 shell 輸出的內容,可能較原來清晰一些。


免責聲明!

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



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