Docker 镜像设置时区

Docker Hub 中的官方镜像,一般都默认设置为 UTC 时间。而我们位于东八区,在启动容器或构建自己的镜像时,往往需要对时区进行设置。根据基础镜像的不同,设置时区的方法也有所区别。

https://blog.csdn.net/this_is_id/article/details/113364718

基于 Alpine 镜像

与 Debian 镜像不同,Alpine 镜像中并没有包含 tzdata,所以只设置 TZ 环境变量并不能达到我们想要的效果,因此需要安装 tzdata。

/ # date
Sat Jan 12 10:37:07 UTC 2019
/ # export TZ=Asia/Shanghai
/ # date
Sat Jan 12 10:37:34 UTC 2019
/ # apk add tzdata
......
......
/ # date
Sat Jan 12 18:38:18 CST 2019
基础镜像:

FROM alpine:latest

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
#RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone
RUN apk update \
    && apk add tzdata \
    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo "${TZ}" > /etc/timezone \
    && rm /var/cache/apk/*
Nginx 镜像:

Nginx 貌似安装过了tzdata工具,只需要设置 TZ 环境参数即可

FROM nginx:stable-alpine

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone
OpenJDK 镜像:
#FROM openjdk:11-jre-alpine
#FROM openjdk:11-jdk-alpine
#FROM openjdk:8-jre-alpine
#FROM openjdk:8-jdk-alpine

FROM openjdk:8-jre-alpine

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
#RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone
RUN apk update \
    && apk add tzdata \
    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo "${TZ}" > /etc/timezone \
    && rm /var/cache/apk/*

由于无法直接通过环境变量设置时区,因此需要在容器中使用本地时间时,只能先基于原有的镜像构建自己的镜像,在启动容器时使用自己构建的镜像即可。

Spring Boot 项目 Dockerfile 示例:
FROM openjdk:8-jdk-alpine

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
#RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone
RUN apk update \
    && apk add tzdata \
    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && echo "${TZ}" > /etc/timezone \
    && rm /var/cache/apk/*

# 申明临时卷
VOLUME /logs
VOLUME /tmp

# 拷贝本地Jar包到根目录
ADD ./target/app-1.0.0-SNAPSHOT.jar /

# 挂着启动脚本
CMD ["sh", "-c", "java -jar app-1.0.0-SNAPSHOT.jar"]

#ENTRYPOINT ["java", "-jar", "app-1.0.0-SNAPSHOT.jar"]
Uni-App 项目 Dockerfile 示例:
FROM nginx:stable-alpine

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

# 拷贝打包资源
ADD nginx.conf /etc/nginx/nginx.conf
ADD unpackage/dist/build/h5/ /usr/share/nginx/html

# 挂在启动点
ENTRYPOINT ["nginx-debug", "-g", "daemon off;"]
Vue 项目 Dockerfile 示例:
FROM nginx:stable-alpine

# 自定义环境变量
ENV TZ=Asia/Shanghai

# 设置本地系统时间和时区
RUN ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone

# 拷贝打包资源
ADD nginx.conf /etc/nginx/nginx.conf
ADD dist/ /usr/share/nginx/html

# 挂在启动点
ENTRYPOINT ["nginx-debug", "-g", "daemon off;"]

基于 Debian 镜像

由于 Debian 镜像中已经包含了 tzdata,因此设置时区的方法比较简单,只需添加环境变量 TZ 即可。我们可以通过启动一个 Debian 容器,运行其中的 date 命令来验证。

root@69d5b5d49-6shjt:/# date
Tue May 24 02:16:23 UTC 2022
root@69d5b5d49-6shjt:/# export TZ=Asia/Shanghai
root@69d5b5d49-6shjt:/# date
Tue May 24 10:17:22 CST 2022

当需要在容器中使用本地时间的时候,只需在启动容器时,添加参数-e TZ=Asia/Shanghai即可。

如果是构建 Docker 镜像,可以这样写:

基础镜像:

FROM debian:stretch

# 自定义环境变量
ENV TZ=Asia/Shanghai

基于 Ubuntu 镜像

Ubuntu 镜像中也没有包含 tzdata,设置时区的方法与 Alpine 镜像相似。

root@2a33fc02c099:/# date
Wed Mar  6 13:12:44 UTC 2019
root@2a33fc02c099:/# export TZ=Asia/Shanghai
root@2a33fc02c099:/# date
Wed Mar  6 13:13:08 Asia 2019
root@2a33fc02c099:/# echo "${TZ}" > /etc/timezone
root@2a33fc02c099:/# ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime
root@2a33fc02c099:/# apt update
......
......
root@2a33fc02c099:/# apt install -y tzdata
......
......
root@2a33fc02c099:/# date
Wed Mar  6 21:15:52 CST 2019

写成 Dockerfile 如下:

FROM ubuntu:bionic

ENV TZ=Asia/Shanghai

RUN echo "${TZ}" > /etc/timezone \
    && ln -sf /usr/share/zoneinfo/${TZ} /etc/localtime \
    && apt update \
    && apt install -y tzdata \
    && rm -rf /var/lib/apt/lists/*
作者:Jeebiz  创建时间:2023-02-12 01:47
最后编辑:Jeebiz  更新时间:2024-08-02 14:21