[server] 도커 컨테이너 시간 및 시간대 (변경 사항이 반영되지 않음)

Docker 컨테이너는 시간 정보를 어디서 얻습니까? 기본 우분투 : trusty 이미지에서 일부 컨테이너를 만들었으며이를 실행하고 ‘날짜’를 요청하면 UTC 시간이 표시됩니다.

잠시 동안 Dockerfile에서 다음을 수행 하여이 문제를 해결했습니다.

RUN sudo echo "America/Los_Angeles" > /etc/timezone

그러나 어떤 이유로 작동이 중지되었습니다. 온라인 검색에서 아래 제안을 보았습니다.

docker run -v /etc/timezone:/etc/timezone [image-name]

이 두 가지 방법 모두 시간대를 올바르게 설정합니다!

$ cat /etc/timezone
America/Los_Angeles
$ date
Tue Apr 14 23:46:51 UTC 2015

무엇을 제공하는지 아는 사람이 있습니까?



답변

여기서 비밀은 dpkg-reconfigure tzdata단순히 /etc/localtime의 파일에 대한 사본, 하드 링크 또는 심볼릭 링크 (심볼릭 링크가 선호 됨)로 작성된다는 것입니다 /usr/share/zoneinfo. 따라서 Dockerfile에서 전체적으로이 작업을 수행 할 수 있습니다. 치다:

ENV TZ=America/Los_Angeles
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

그리고 보너스로 TZ도 컨테이너에 올바르게 설정됩니다.

이것은 또한 배포에 구애받지 않으므로 거의 모든 Linux에서 작동합니다.

참고 : 알파인 기반 이미지를 사용하는 경우 tzdata먼저 설치해야합니다 . ( 여기 에서이 문제 참조 )

다음과 같습니다 :

RUN apk add --no-cache tzdata
ENV TZ America/Los_Angeles


답변

일반적으로 다음과 같이 docker 컨테이너에 환경 변수를 설정하면 충분합니다.

docker run -e TZ=Europe/Amsterdam debian:jessie date

물론 이것은 또한 작동합니다 docker-compose.


답변

/etc/localtime이미지에 마운트 하여 동기화하는 host -v것이 가장 인기있는 이미지 입니다.

그러나 이슈 12084 참조 :

소프트웨어에서 파일 /etc/timezone을 설정 해야하는 경우 작동하지 않기 때문에 올바르지 않습니다 .
그런 식으로 사용하면 기본값으로 남습니다 etc/UTC.

실제로 도커 컨테이너 안에 표준 시간대를 설정하는 완벽한 방법이 없다는 것을 확인했습니다.
결국이 솔루션에 정착했습니다.

앱 도커 파일 :

# Relocate the timezone file
RUN mkdir -p /config/etc && mv /etc/timezone /config/etc/ && ln -s /config/etc/timezone /etc/

앱 진입 점 스크립트 :

# Set timezone as specified in /config/etc/timezone
dpkg-reconfigure -f noninteractive tzdata

/config특정 국가 또는 지역으로 현지화 된 데이터 볼륨 도커 파일 :

# Set the time zone
RUN echo "Europe/London" > /config/etc/timezone

… 3 개의 별도 파일이 /etc/localtime포함되어 있으며 모든 런타임 컨테이너 시작 시마다 다시 작성하기 때문에 우아하지 않습니다 . 오히려 낭비입니다.

그러나 제대로 작동하고 기본 앱 이미지와 각 국가 별 로컬 구성을 성공적으로 분리합니다.
3 줄의 코드로


답변

도커 컨테이너에서 로컬 파일 (/ etc / timezone 및 / etc / localtime)을 볼륨으로 추가 할 수 있습니다.

docker-compose.yml다음 줄로 업데이트하십시오 .

volumes:
    - "/etc/timezone:/etc/timezone:ro"
    - "/etc/localtime:/etc/localtime:ro"

이제 컨테이너 시간은 호스트와 동일합니다.


답변

우분투 16.04 이미지에는 버그가 있습니다. 해결책은

    ENV TZ 'Europe/Tallinn'
    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


답변

다음을 기반으로 도커 이미지를 사용하는 경우 ubuntu:

# Change the docker default timezone from UTC to SGT
echo "Asia/Singapore" > /etc/timezone
dpkg-reconfigure tzdata
date


답변

정보와 문제에 대한 링크에 대한 VonC에 감사드립니다. 이것은 복잡한 혼란처럼 보이 므로이 문제를 해결하는 방법에 대한 내 자신의 아이디어를 테스트했으며 훌륭하게 작동하는 것 같습니다.

>docker run -it ubuntu:trusty /bin/bash
#dpkg-reconfigure tzdata

(내 시간대를 선택하라는 메시지를 따릅니다)

>docker commit [container-id] chocko/ubuntu:local

그런 다음 Dockerfile을 다음과 같이 업데이트했습니다.

FROM chocko/ubuntu:local

간과하기가 너무 쉽기 때문에 이것에 문제가있는 것 같습니다.