AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 683605
Accepted
Chockomonkey
Chockomonkey
Asked: 2015-04-15 15:49:44 +0800 CST2015-04-15 15:49:44 +0800 CST 2015-04-15 15:49:44 +0800 CST

Docker 容器时间和时区(不会反映更改)

  • 772

Docker 容器从哪里获取时间信息?我从基本的 ubuntu: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

有谁知道给了什么?

date
  • 11 11 个回答
  • 503501 Views

11 个回答

  • Voted
  1. Best Answer
    Michael Hampton
    2015-04-18T11:55:01+08:002015-04-18T11:55:01+08:00

    这里的秘密是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。

    注意:如果您使用的是基于 alpine 的映像,则必须安装第tzdata一个。(在这里看到这个问题)

    看起来像这样:

    RUN apk add --no-cache tzdata
    ENV TZ America/Los_Angeles
    
    • 350
  2. Victor Klos
    2017-01-14T14:15:16+08:002017-01-14T14:15:16+08:00

    通常在 docker 容器中设置一个环境变量就足够了,如下所示:

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

    当然,这也适用于docker-compose.

    • 114
  3. Y4roc
    2017-06-09T07:55:26+08:002017-06-09T07:55:26+08:00

    您可以将本地文件(/etc/timezone 和 /etc/localtime)添加为 docker-container 中的卷。

    docker-compose.yml使用以下几行更新您的。

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

    现在容器时间与您主机上的时间相同

    • 37
  4. VonC
    2015-04-15T22:14:20+08:002015-04-15T22:14:20+08:00

    安装/etc/localtime在图像中,因此它是host -v最流行的一种。

    但请参阅问题 12084:

    这是不正确的,因为当软件需要设置文件时它不起作用/etc/timezone。
    您使用的这种方式将其保留为默认值etc/UTC。

    我已经确定实际上没有万无一失的优雅方法来设置 docker 容器内的时区。
    所以最终确定了这个解决方案:

    应用程序dockerfile:

    # 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
    

    数据卷/configdockerfile,本地化到特定国家或地区:

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

    ...它并不优雅,因为涉及 3 个单独的文件,并且/etc/localtime在每个运行时容器启动时重新创建。这是相当浪费的。

    但是,它确实可以正常工作,并成功实现了基本应用程序映像和每个国家/地区的本地化配置之间的分离。
    在 3 行代码中。

    • 22
  5. qwerty
    2017-06-20T02:12:48+08:002017-06-20T02:12:48+08:00

    在 ubuntu 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
    
    • 18
  6. Alpha
    2018-04-25T17:05:39+08:002018-04-25T17:05:39+08:00

    在这里加上我的两分钱,因为我已经尝试了其中的几个,但没有一个适用于基于 alpine 的图像。

    然而,这成功了:

    ENV TZ=America/Toronto
    RUN apk update
    RUN apk upgrade
    RUN apk add ca-certificates && update-ca-certificates
    RUN apk add --update tzdata
    RUN rm -rf /var/cache/apk/*
    

    [来源]

    • 5
  7. Xianlin
    2015-07-16T19:37:35+08:002015-07-16T19:37:35+08:00

    如果您使用基于以下内容的 docker 映像ubuntu:

    # Change the docker default timezone from UTC to SGT
    echo "Asia/Singapore" > /etc/timezone
    dpkg-reconfigure tzdata
    date
    
    • 4
  8. flynn
    2020-05-29T19:00:22+08:002020-05-29T19:00:22+08:00

    在 alpine 基本图像中(示例使用节点:10.16.0-alpine):

    Dockerfile

    FROM node:10.16.0-alpine
    
    ENV TZ=America/Los_Angeles
    
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    WORKDIR /app
    
    COPY package.json package-lock.json ./
    
    RUN npm i --production
    
    COPY . .
    
    CMD node index.js
    
    
    • 4
  9. Perry Harrington
    2021-05-06T23:26:39+08:002021-05-06T23:26:39+08:00

    使用 Fedora 容器(也可能与 ubuntu 一起使用):

    我发现的最简单的解决方案是在 docker-compose.yml 中使用以下内容

    environment: 
      TZ: "${TZ:-America/Los_Angeles}"
    

    然后在您的 .env 文件中(docker-compose 自动读取)

    TZ=America/Los_Angeles
    

    这允许您将 docker-compose.yml 置于版本控制之下,并使用可被 git 忽略的自定义 .env 文件。

    您获得容器的默认值并获得自定义,两全其美。

    对于 Fedora,无需进行其他更改,它就可以工作!

    • 4
  10. Chockomonkey
    2015-04-16T11:10:14+08:002015-04-16T11:10:14+08:00

    感谢 VonC 提供的信息和问题链接。这似乎是一个令人费解的混乱,所以我对如何解决这个问题的想法进行了一些测试,它似乎工作得很好。

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

    (按照提示选择我的时区)

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

    然后我更新了我的 Dockerfiles 以反映这一点:

    FROM chocko/ubuntu:local
    

    这一定有问题,因为它似乎太容易被忽视......或者这是可以接受的吗?

    • 3

相关问题

  • 无法在 CentOS 虚拟机上设置日期

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve