1. 도커 컨테이너 생성시 Timezone 설정
(1) 환경 변수 TZ 추가
- 컨테이너 환경 변수 TZ에 원하는 타임존으로 할당하면 된다.
# docker run [옵션] 이미지명 [명령어] [인수...]
PS E:\docker> docker run -d --name db -e TZ=Asia/Seoul mcr.microsoft.com/mssql/server:2022-latest
[옵션]
- --detach, -d : 컨테이너를 생성하고 백그라운드에서 실행한다
- -name : 컨테이너 이름 지정
- --publish, -p : 컨테이너의 포트를 호스트에 게시
- --volumes, -v : 볼륨 바인드 마운트 설정
- --user, -u : 사용자 이름 또는 UID
- --env, -e : 컨테이너 내에서 사용할 환경 변수 설정
- --hostname, -h : 컨테이너의 호스트 이름 설정
- --restart : 컨테이너 종료시, 재시작 정책 설정(always : 항상 재시작, on-failure : 종료 스테이터스가 0이 아닐 때 재시작. --rm 옵션과 --restart 옵션은 동시에 사용할 수 없습니다.)
(2) 도커 컴포즈 파일 설정
- 도커 컴포즈 파일(docker-compose.yml)에 환경 변수 TZ를 원하는 타임존으로 할당하면 된다.
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
...........................................................
environment:
TZ: Asia/Seoul
(3) dockerfile에서 설정
- 컨테이너를 띄울 때 말고 이미지 자체에 설정을 하고 싶은 경우 Dockerfile을 수정할 수 있다. Dockerfile에 다음을 추가한다.
...........................................................
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y tzdata
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
...........................................................
- DEBIAN_FRONTEND=noninteractive 설정을 해두면 패키지 설치시 사용자의 입력을 받지 않고 넘어간다.
- 만약 /usr/share/zoneinfo가 존재하지 않아서 오류가 발생한다면, RUN apt-get install -y tzdata 명령어로 tzdata(time zone data)을 설치한다.
- $TZ 환경 변수에 저장된 값을 읽어와서 시간대를 설정한다. $TZ환경 변수는 이미지를 빌드할 때 --build-arg 플래그로 전달되는 값으로, Dockerfile 내에서 $TZ 환경 변수를 사용하면 빌드할 때 전달한 시간대 값이 설정된다.
- 다음으로 /usr/share/zoneinfo/$TZ 파일을 /etc/localtime파일로 심볼릭 링크를 걸어서 시간대 설정을 한다. 이를 통해 호스트 컴퓨터의 시간대를 쉽게 컨테이너 내부로 가져올 수 있다.
- 마지막으로, $TZ값을 /etc/timezone 파일에 저장한다. 이를 통해 컨테이너 내부의 시간대 설정이 영구적으로 유지되도록 한다.
2. 도커 컨테이너 생성후 Timezone 변경
(1) 도커 컨테이너 shell 환경에서 타임존 변경 명령어 이용
① 터미널에서 아래 명령어를 이용하여 컨테이너 shell 환경 root 권한으로 접속
PS E:\docker> docker exec -u root -it mssql2022 /bin/bash
② 커맨드 창에 아래와 같이 타임존 변경 명령어를 입력후 항목 선택(6 : Asia, 69 : Seoul 선택)
root@c80af4f2ea67:/# 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 78.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.34.0 /usr/local/share/perl/5.34.0 /usr/lib/x86_64-linux-gnu/perl5/5.34 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.34 /usr/share/perl/5.34 /usr/local/lib/site_perl) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
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 7. Atlantic 9. Indian 11. US
2. America 4. Australia 6. Asia 8. Europe 10. Pacific 12. Etc
Geographic area: 6
Please select the city or region corresponding to your time zone.
1. Aden 16. Brunei 31. Hong_Kong 46. Kuala_Lumpur 61. Pyongyang 76. Tehran
2. Almaty 17. Chita 32. Hovd 47. Kuching 62. Qatar 77. Tel_Aviv
3. Amman 18. Choibalsan 33. Irkutsk 48. Kuwait 63. Qostanay 78. Thimphu
4. Anadyr 19. Chongqing 34. Istanbul 49. Macau 64. Qyzylorda 79. Tokyo
5. Aqtau 20. Colombo 35. Jakarta 50. Magadan 65. Rangoon 80. Tomsk
6. Aqtobe 21. Damascus 36. Jayapura 51. Makassar 66. Riyadh 81. Ujung_Pandang
7. Ashgabat 22. Dhaka 37. Jerusalem 52. Manila 67. Sakhalin 82. Ulaanbaatar
8. Atyrau 23. Dili 38. Kabul 53. Muscat 68. Samarkand 83. Urumqi
9. Baghdad 24. Dubai 39. Kamchatka 54. Nicosia 69. Seoul 84. Ust-Nera
10. Bahrain 25. Dushanbe 40. Karachi 55. Novokuznetsk 70. Shanghai 85. Vientiane
11. Baku 26. Famagusta 41. Kashgar 56. Novosibirsk 71. Singapore 86. Vladivostok
12. Bangkok 27. Gaza 42. Kathmandu 57. Omsk 72. Srednekolymsk 87. Yakutsk
13. Barnaul 28. Harbin 43. Khandyga 58. Oral 73. Taipei 88. Yangon
14. Beirut 29. Hebron 44. Kolkata 59. Phnom_Penh 74. Tashkent 89. Yekaterinburg
15. Bishkek 30. Ho_Chi_Minh 45. Krasnoyarsk 60. Pontianak 75. Tbilisi 90. Yerevan
Time zone: 69
Current default time zone: 'Asia/Seoul'
Local time is now: Sat Jul 6 14:06:03 KST 2024.
Universal Time is now: Sat Jul 6 05:06:03 UTC 2024.
(2) 도커 컨테이너 shell 환경에서 /etc/localtime 심볼릭 링크 이용
① 터미널에서 아래 명령어를 이용하여 컨테이너 shell 환경 root 권한으로 접속
PS E:\docker> docker exec -u root -it mssql2022 /bin/bash
② 기존의 localtime(심볼릭링크)을 삭제
root@c80af4f2ea67:/# rm -rf /etc/localtime
root@c80af4f2ea67:/# ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
(3) 설정 파일 config.v2.json 수정
- config.v2.json 파일 Env 항목에 "TZ=원하는 타임존"으로 추가 또는 수정하면 된다.
① 사용중인 컨테이너 아이디 얻기
PS E:\docker> docker inspect {container-name}
[
{
"Id": "{container-id}",
...........................................................
# 리눅스 $ sudo systemctl stop docker
- 리눅스는 위 명령어로 도커 엔진를 종료시키고, 윈도우 도커 데스크탑은 태스크 트레이에서 도커 데스크톱을 마우스 우클릭 후에 Quit Docker Desktop을 선택하면 엔진이 종료된다.
③ config.v2.json 파일 수정
- 리눅스 파일 위치
/var/lib/docker/containers/{container-id}/config.v2.json
\\wsl.localhost\docker-desktop-data\data\docker\containers\{container-id}/config.v2.json
# 리눅스
$ vi /var/lib/docker/containers/{container-id}/config.v2.json
{
...........................................................
"Env": [
"TZ=Asia/Seoul",
...........................................................
],
...........................................................
}
- 리눅스는 vi로 config.v2.json 파일을 수정하고, 윈도우는 메모장으로 해당 파일을 열어서 수정한다.
④ 도커 엔진 시작
# 리눅스
$ sudo systemctl start docker
- 리눅스는 위 명령어로 도커 엔진를 시작시키고, 윈도우는 바탕화면 또는 시작 메뉴에 Docker Desktop 링크를 클릭해 Docker Desktop을 실행한다.
출처 : https://blog.naver.com/islove8587/223503368641