如何修复 Docker 构建生成的容器中的时区

use*_*172 6 timezone docker ubuntu-18.04

docker抱歉,我是和的新手docker-compose

“保存的”容器不显示正确的时区。

背景:

  1. 由于公司限制,我无法将 Dockerized SpringBoot应用程序放置到主机 B 上。
  2. 我的老板告诉我在主机 A 中Dockerized SpringBoot应用程序。
  3. 保存docker save $imageName > application.tar在主机A中
  4. 将保存的镜像加载docker load < application.tar到主机B中
  5. 在主机 B 中运行 Docker 镜像...
  6. 主机A和主机B处于同一时区(香港时间)

结果:

  1. 容器内时区(检查日志结果)发现主机A中的日志时间是正确的(香港时区,UTC+8)(无论是由docker run或触发docker compose

  2. 容器内时区(检查日志结果)发现主机B中日志时间错误(UTC+0)(无论是由docker run或触发docker compose

docker版本客户端:版本:1.13.1 API版本:1.26软件包版本:docker-1.13.1-88.git07f3374.el7.x86_64 Go版本:go1.10.2 Git提交:07f3374/1.13.1构建:2007年12月6日星期四: 01:49 2018 操作系统/架构:linux/amd64

docker-compose 版本 docker-compose 版本 1.23.2,内部版本 1110ad01 docker-py 版本:3.6.0 CPython 版本:3.6.7 OpenSSL 版本:OpenSSL 1.1.0f 2017 年 5 月 25 日

托管 Ubuntu 版本 18.04.3

FROM java:8-jdk-alpine
WORKDIR /root/flexi/
COPY ./target/foo.jar /root/flexi/

### an alpine based image you have to install the tzdata first #### 
RUN apk add --no-cache tzdata


### ENV TZ=Asia/Hong_Kong
### RUN echo "Europe/Stockholm" > /etc/timezone
### RUN dpkg-reconfigure -f noninteractive tzdata
### Not work for ubuntu to dpkg-reconfigure


VOLUME /log

ADD db.properties /root/flexi
EXPOSE 9988
RUN sh -c 'touch foo.jar'
ENTRYPOINT ["java", "-jar", "foo.jar"]
Run Code Online (Sandbox Code Playgroud)
version: '2.2'
services:
  foos:
    build:
      context: ./
      dockerfile: Dockerfile
    image: foos
    ports:
      - "9555:9988"
    environment:
      - TZ=Asia/Hong_Kong
    networks:
      - network1
    volumes:
      - /log:/log
networks:
  network1:
Run Code Online (Sandbox Code Playgroud)
docker build -t foos .
Run Code Online (Sandbox Code Playgroud)
docker inspect -f '{{ .Created }}'  foos
--> Shows UTC time (in both Host A and Host B)
Run Code Online (Sandbox Code Playgroud)

小智 1

使用环境变量设置时区

  • 可以使用环境变量设置容器的时区

docker run -e TZ=America/New_York ubuntu 日期

  • 容器中需要安装时区数据包tzdata
  • 配置 NTP 服务器以确保容器中的时区同步