Ubuntu 16.04(xenial)의 Docker 컨테이너의 타임 존을 일본(JST)으로 한다(Dockerfile에서)

우분투 Docker 컨테이너에서 시간대를 변경하고 싶습니다.



Docker에서 Ubuntu를 특별히 아무것도 하지 않고 세웠을 때는 타임 존이 UTC가 됩니다만, 일본에 살고 일본 시간으로 일상 생활을 보내고 있는 나에게 있어서는, 역시 컨테이너상의 타임 존도 JST 쪽이 로그 라든지의 취급이 하기 쉽기 때문에, JST 로 하는 방법을 여러가지 시험하고 있었습니다만 시행착오한 로그입니다.

덧붙여서 보통으로 시작했을 때는 역시 UTC였습니다.
% docker run --rm -i -t ubuntu:xenial
root@b4eb0482f2cb:/# date
Wed Jun  7 04:25:42 UTC 2017

유명한 방법 중 하나로 /etc/localtime을 마운트하는 방법이 있으며,이 방법을 사용하면 Docker Hub에서 떨어 뜨린 이미지를 그대로 사용할 수 있으므로 빌드가 필요하지 않습니다.

하지만 어쨌든 마운트해도 변하지 않았고, 타임 존을 변경하고 싶은 컨테이너가 오리지날의 컨테이너였던 것도 있어, Dockerfile 내에서 컨테이너 빌드중으로 변경하기로 했습니다 .

우분투 14.04 그렇게 쉽게 만들어졌습니다.



컨테이너에서 시작하는 Ubuntu가 14.04(trusty)인 경우라면 다음 Dockerfile에서 변경할 수 있었습니다.

Dockerfile.ubuntu_trusty
FROM ubuntu:trusty

ENV TZ Asia/Tokyo
RUN echo "${TZ}" > /etc/timezone \
   && dpkg-reconfigure -f noninteractive tzdata
% docker build --tag ubuntu-jst:trusty -f Dockerfile.ubuntu_trusty .
  :
% docker run --rm -i -t ubuntu-jst:trusty
root@4fbcbb5f70c4:/# date
Wed Jun  7 21:10:54 JST 2017

그러나 같은 방법으로 ubuntu : xenial을 기반으로하면 이끼가 버립니다.
% docker build --tag ubuntu-jst:xenial -f Dockerfile.ubuntu_xenial .
Sending build context to Docker daemon  5.12 kB
Step 1/3 : FROM ubuntu:xenial
 ---> 7b9b13f7b9c0
Step 2/3 : ENV TZ Asia/Tokyo
 ---> Running in 1d3359c286c7
 ---> cfb72b2e99e6
Removing intermediate container 1d3359c286c7
Step 3/3 : RUN echo "${TZ}" > /etc/timezone   && dpkg-reconfigure -f nonintractive tzdata
 ---> Running in 1d964b6a380c
debconf: unable to initialize frontend: Nonintractive
debconf: (Can't locate Debconf/FrontEnd/Nonintractive.pm in @INC (you may need to install the Debconf::FrontEnd::Nonintractive module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at (eval 19) line 2.)
debconf: falling back to frontend: Noninteractive
dpkg-query: package 'tzdata' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files,
and dpkg --contents (= dpkg-deb --contents) to list their contents.
/usr/sbin/dpkg-reconfigure: tzdata is not installed

무엇이 원인인지



오류 메시지에 설명된 대로 Docker Hub에 있는 Ubuntu 이미지에 tzdata 명령 자체가 원래 포함되어 있지 않기 때문입니다. 원래 Ubuntu 는 16.04 에서 systemd 로 되어 있는 영향으로 , 본래라면 timedatectl 로 타임 존을 설정해야 하기 때문에 , 그 잘못도 있어 디폴트로 들어 있지 않은 것일지도 모릅니다 1 .

노력하면 Docker에서 systemd를 다루는 방법도 없기 때문에 이것으로 timezonectl 봉투를 열기 위해 일본도를 준비하는 것과 같습니다.

조금 이야기가 그랬습니다만, 일단 tzdata 는, 아직 apt-get 로 넣을 수 있는 것 같기 때문에 고맙게 패키지 관리 시스템에 의해 얻은 타락을 누리기로 합니다.

Dockerfile
FROM ubuntu:xenial

# パッケージ取得先のミラーをjaistに変更する
RUN sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list

ENV TZ Asia/Tokyo
RUN apt-get update \
  && apt-get install -y tzdata \
  && rm -rf /var/lib/apt/lists/* \
  && echo "${TZ}" > /etc/timezone \
  && rm /etc/localtime \
  && ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
  && dpkg-reconfigure -f noninteractive tzdata

이제 JST Ubuntu 컨테이너를 준비 할 수있었습니다.
% docker build --tag ubuntu-jst:xenial -f Dockerfile.ubuntu_xenial .
:
% docker run --rm -i -t ubuntu-jst:xenial
root@2646f266e8d1:/# date
Wed Jun  7 21:41:08 JST 2017





OS X Yosemite && Docker 17.03.1-ce-mac12 (17661)  2

14.04 라고 locale-gen 를 사용해 언어도 바꾸어지고 있었지만 이것도 할 수 없게 되어 있습니다. 어쩌면 컨테이너의 용량을 낮추기 위한 대책에 휘말렸을지도 모릅니다.

좋은 웹페이지 즐겨찾기