소리소문 없이... 사랑도 명예도 이름도 남김 없이...
DexCore.net

Docker

[Docker] 도커 컨테이너 Timezone 설정

탑~! 2025. 2. 19. 11:22

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

728x90
반응형