Docker로 ASP.NET Core 또는  .NET Core Background Service 등을 만들어 배포할 때 주로 사용하는 기본 이미지가 aspnet:3.1-bionic 정도가 되겠다. (사실 bionic, buster-slim 정도만 써 봤을 뿐, 다른 버전이 얼마나 더 있는지 모른다.)

그런데, 해당 이미지는 시간 설정이 UTC (GMT) 기준으로 되어 있어 로그를 찍거나 기타 시간 관련된 작업을 하려고 보면 한국 시간과는 9시간 차이가 난다... ㄷㄷ Docker 이미지가 대부분 그렇단다.

컨테이너를 실행한 다음 시간을 찍어보면 기본적으로 위와 같이 나온다. (현재 시각은 8월 11일 14:20)

이걸 바로 잡으려면 한국 시간 기준으로 수정하려면 리눅스 호스트 환경에서는 /etc/localtime 경로를 볼륨 링크로 마운트해 주면 되긴 한데... 윈도우 환경에서는 그렇게 할 수도 없고, 뭔가 좀 복잡하고 어렵다. 인터넷을 뒤져봐도 뭔가 해결 방법이 잔뜩 나와 있긴 한데 하나 같이 안되는 방법들 뿐이다.

인터넷에 나와 있는 대로 docker-compose.yml 파일에다 environment 변수로 TZ=Asia/Seoul를 넣어주면 조금 바뀌긴 한다...

지역이 아시아로 바뀌는데, 시간은 여전히 똑같이 UTC 시간 기준이다. 그리고 뭔가가 없다고 한다. 아마도 이미지를 만들면서 불필요하다고 생각되어 빠진 기능들 중에 시간 설정 기능(timezone, localtime)이 들어있었던 것일 듯...

 

그래서

방법을 연구해 봤는데, 의외로 간단하게 방법이 떠올랐다.

바로! aspnet:3.1-bionic 이미지를 그대로 쓰는 것이 아니라,
거기에다 시간 설정 기능을 추가 포함/설치한 이미지를 만들고 그걸 기본 이미지로 쓰는 방법이다. 유레카!

시간 설정 기능을 찾아보니 tzdata 라는 녀석으로, 설치하는 방법을 찾아 보니 많이 있는데 아래 링크의 방법이 가장 확실하고 괜찮아 보였다.

>> 참조: https://stackoverflow.com/questions/40234847/docker-timezone-in-ubuntu-16-04-image

 

Docker Timezone in Ubuntu 16.04 Image

I have created a Docker container using the Ubuntu 16.04 image. docker run -it -d --name containername -v /var/www/public --privileged ubuntu after creating the container, I checked the date ins...

stackoverflow.com

 

이미지를 새로 빌드하기 위해 Dockerfile 파일을 따로 하나 더 만들어 봤다.

 

[Dockerfile.aspnet_kor]

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic
ENV TZ=Asia/Seoul
ENV DEBIAN_FRONTEND=noninteractive
RUN echo $TZ > /etc/timezone && \
    apt-get update && apt-get install -y tzdata && \
    rm /etc/localtime && \
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    dpkg-reconfigure -f noninteractive tzdata && \
    apt-get clean

별 것 없다. 환경설정 변수 두 개에... 위 링크에 있는 tzdata 설치 및 기본 설정 명령어(위 링크에 있다).

기본적으로 tzdata 설치 시 상호작용(interactive) 모드로 설치되기 때문에 Asia(6), Seoul(69)을 선택해야 넘어가게 되는데 기본 모드를 비상호작용(noninteractive) 모드로 설정해 주면 설치가 멈추지 않고 깔끔하게 넘어가게 된다.

실행할 때 이미지 이름을 aspnet:3.1-kor로 지어주었다.

D:\Docker> docker build -t aspnet:3.1-kor -f Dockerfile.aspnet_kor .

 

자동으로 설치가 진행되어 새로운 이미지가 생성되었고, 원래 용량(205MB)보다 약 30MB 정도 커졌다(238MB).

D:\Docker>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnet 3.1-kor d13de77bxxxx 2 hours ago 238MB
mariadb latest ac9c11a1xxxx 2 months ago 357MB
mcr.microsoft.com/dotnet/core/aspnet 3.1-bionic 7d9a76dbxxxx 2 months ago 205MB

 

이후 지역 및 시간 설정은 docker-compose.yml 파일에 TZ 환경변수만 지정하면 자동으로 된다.

[docker-compose.yml(샘플)]

...

  tutorialapp:
    container_name: tutorialapp
#    image: mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic
    image: aspnet:3.1-kor
    ports:
      - 5000:80
      - 5001:443
    volumes:
      - ./publish/:/app/
      - ./appsettings.Docker.json:/app/appsettings.json
      - ./logs/:/app/logs/
    networks:
      - v_network
    working_dir: /app
    environment:
      TZ: Asia/Seoul
    entrypoint:
      - dotnet
      - TutorialWeb.Core.dll

environment 설정 방법이 몇 가지 방식이 보이던데,
name: value 와 같이 써도 되고, - name=value 와 같이 써도 된다. 똑같다. (표준화는 필요할 듯 ㄷㄷ)

 

 

끝.

 

 



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]