【问题标题】:Docker Timezone in Ubuntu 16.04 ImageUbuntu 16.04 映像中的 Docker 时区
【发布时间】:2016-10-25 08:19:49
【问题描述】:

我使用 Ubuntu 16.04 映像创建了一个 Docker 容器。

docker run -it -d --name containername -v /var/www/public --privileged ubuntu

创建容器后,我检查了容器内的日期:

$ date
Tue Oct 25 08:10:34 UTC 2016

但是,我需要它来使用 Asia/Kolkata 时区。所以我尝试更改/etc/timezone 文件,然后更改docker stopdocker start 容器,但它不起作用。它仍然显示相同的时间。

Docker容器创建后如何更改时区?

【问题讨论】:

    标签: datetime docker containers


    【解决方案1】:

    更新/etc/timezone 是通常的方式,但是有一个bug in Xenial 这意味着它不起作用。

    相反,您需要创建一个从所需时区到etc/localtime 的链接:

    FROM ubuntu:xenial     
    RUN ln -fs /usr/share/zoneinfo/US/Pacific-New /etc/localtime && dpkg-reconfigure -f noninteractive tzdata
    

    【讨论】:

    • Mountain 不是 Pacific-New 而是哪一个?
    • 我的容器在/usr/share/zoneinfo 下的唯一路径是/usr/share/zoneinfo/Etc/UTC,所以这不起作用;(
    • dpkg-query: package 'tzdata' is not installed and no information is available 使用 dpkg --info (= dpkg-deb --info) 检查存档文件,使用 dpkg --contents (= dpkg-deb --contents) 列出它们的内容。 /usr/sbin/dpkg-reconfigure: tzdata 没有安装
    • echo $TZ > /etc/timezone 似乎是 ? Debian方式? . ln -sf /usr/share/zoneinfo/$TZ /etc/localtime 是 CentOS/Redhat 的方式。然而,里程数因其他操作系统而异,应用程序并不总是使用操作系统时区。应用服务启动脚本可能需要自定义时区。
    【解决方案2】:

    在 ubuntu 16.04 中我缺少 tzdata,所以我必须安装它。工作解决方案是

        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
    

    【讨论】:

    • 请注意,我们还需要添加ENV DEBIAN_FRONTEND=noninteractive。否则,apt-get install -y tzdata 将以交互模式运行。
    【解决方案3】:

    试试:

    echo "Asia/Kolkata" > /etc/timezone
    rm -f /etc/localtime
    dpkg-reconfigure -f noninteractive tzdata
    

    由于Ubuntu bug,您必须执行rm /etc/localtime

    【讨论】:

    • 太棒了。迄今为止最简单的解决方案。
    【解决方案4】:

    作为said here,秘密在于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等好多了
    【解决方案5】:

    这个非常简单的解决方案 (https://serverfault.com/a/826222) 解决了我的问题:在环境变量中添加时区。

    命令是docker run -e TZ=Europe/Amsterdam ...

    或者,像我一样使用 docker-compose:

    version: '3'
    services:
        web:
            build: ./app
            ports:
                - ...
            volumes:
                - ...
            environment:
                - TZ=Europe/Paris
    

    就我而言,不再需要 tzdata,也不需要与 /etc/timezone 和 /etc/localtime 共享卷。
    希望对您有所帮助!

    【讨论】:

      【解决方案6】:

      如果您使用 docker-compose,只需在您的 docker-compose.yml 文件中添加一行。

      版本:'3'

      services:
        ubuntu-local:
          image: ubuntu:16.04
          restart: on-failure
          command: python3 run_my_code.py
          working_dir: /code
          volumes:
            - ./code:/code
            - /etc/localtime:/etc/localtime:ro   # <--add this line to set timezone
          environment:
            - PYTHONUNBUFFERED=1
      

      【讨论】:

      • tzdata 包似乎没有安装在官方 docker ubuntu 镜像中,为此使用原始 docker 机制听起来更好。
      【解决方案7】:

      我采用了这种方法:

      1. 将文件 /etc/localtime 复制到某处。

      2. 打开它,找到这个数字(以黄色突出显示)

      3. -3 对应于莫斯科时间。对于柏林集 -1 。如果需要正值,请设置 UTC2

      4. 根据您的时区复制和修改 /etc/timezone。

      5. 将它们链接到您的容器

      结果:

      【讨论】:

        【解决方案8】:

        已解决:

        FROM ubuntu:16.04
        
        RUN apt-get update && \
            apt-get install -y software-properties-common apt-utils locales tzdata
        
        RUN echo "tzdata tzdata/Areas select Europe" > timezone.txt
        RUN echo "tzdata tzdata/Zones/Europe select Rome" >> timezone.txt
        RUN debconf-set-selections timezone.txt
        RUN rm /etc/timezone
        RUN rm /etc/localtime
        RUN dpkg-reconfigure -f noninteractive tzdata
        

        【讨论】:

          【解决方案9】:

          Dockerfile:

          RUN apt-get update && \
              apt-get install -yq tzdata && \
              ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime && \
              dpkg-reconfigure -f noninteractive tzdata
          

          参考:https://dev.to/0xbf/set-timezone-in-your-docker-image-d22

          注意:需要以root用户身份运行

          【讨论】:

            【解决方案10】:

            我也遇到了 Ubuntu 18.04 docker 容器的这个问题。由于未安装 tzdata 软件包。泊坞窗内没有/usr/share/zoneinfo 目录。我们需要先安装tzdata并使用dpkg-reconfigure来设置时区。以下 docker 命令适用于我:

            ENV DEBIAN_FRONTEND=noninteractive
            RUN apt-get update && apt-get install -y --no-install-recommends tzdata \
                && rm -rf /var/lib/apt/lists/*
            RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
                && dpkg-reconfigure --frontend noninteractive tzdata
            

            【讨论】:

              【解决方案11】:

              在运行 docker 容器时简单地映射卷

              -v /etc/timezone:/etc/timezone:ro

              【讨论】:

                猜你喜欢
                • 2019-01-16
                • 1970-01-01
                • 2019-03-22
                • 1970-01-01
                • 2017-11-29
                • 2017-08-10
                • 1970-01-01
                • 1970-01-01
                • 2018-12-15
                相关资源
                最近更新 更多