dockerfile 设置时区 | docker时区设定 | 为什么docker设置了环境变量TZ仍不生效

更新于 2026-01-08 14:20 6
专栏: Docker 标签: docker

这两天服务器到期了,准备把项目全部迁走到新服务器,因为我的博客项目之前是二进制方式运行在服务器的,我想为了方便迁移将程序编译成docker镜像,结果死活时区都不正确,即使在运行时已经设置了 TZ=Asia/Shanghai 但是仍然不生效。在我问过ai之后才得知不是所有的镜像都包含时区配置的支持,比如我现在使用的这个ubuntu就是不支持的,所以需要在构建的时候加入这些设置才行

让docker编译的镜像支持时区设置

  1. FROM golang AS build_image
  2. WORKDIR /build
  3. COPY . .
  4. RUN go env -w GO111MODULE=on \
  5. && go env -w GOPROXY=https://goproxy.cn,direct \
  6. && go mod tidy \
  7. && go build -o eblog main.go \
  8. && cp conf/app.example.conf conf/app.conf \
  9. && mkdir build_finsh \
  10. && cp -r conf build_finsh/conf \
  11. && cp eblog build_finsh/eblog \
  12. && cp -r profile build_finsh/profile \
  13. && cp -r static build_finsh/static \
  14. && cp -r views build_finsh/views
  15. # ===============================
  16. # Runtime image
  17. # ===============================
  18. FROM ubuntu:24.04
  19. # 只提供时区能力,不锁定时区
  20. ENV DEBIAN_FRONTEND=noninteractive
  21. RUN apt-get update \
  22. && apt-get install -y --no-install-recommends tzdata ca-certificates \
  23. && rm -rf /var/lib/apt/lists/*
  24. WORKDIR /app
  25. COPY --from=build_image /build/build_finsh /app
  26. EXPOSE 8080
  27. CMD ["./eblog"]

设置一个默认的时区,并支持运行时动态设置

  1. FROM golang AS build_image
  2. WORKDIR /build
  3. COPY . .
  4. RUN go env -w GO111MODULE=on \
  5. && go env -w GOPROXY=https://goproxy.cn,direct \
  6. && go mod tidy \
  7. && go build -o eblog main.go \
  8. && cp conf/app.example.conf conf/app.conf \
  9. && mkdir build_finsh \
  10. && cp -r conf build_finsh/conf \
  11. && cp eblog build_finsh/eblog \
  12. && cp -r profile build_finsh/profile \
  13. && cp -r static build_finsh/static \
  14. && cp -r views build_finsh/views
  15. # ==============================
  16. # Runtime image
  17. # ==============================
  18. FROM ubuntu:24.04
  19. ENV TZ=Asia/Shanghai
  20. ENV DEBIAN_FRONTEND=noninteractive
  21. # 安装时区数据库并配置系统时区
  22. RUN apt-get update \
  23. && apt-get install -y --no-install-recommends tzdata ca-certificates \
  24. && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
  25. && echo $TZ > /etc/timezone \
  26. && rm -rf /var/lib/apt/lists/*
  27. WORKDIR /app
  28. COPY --from=build_image /build/build_finsh /app
  29. EXPOSE 8080
  30. CMD ["./eblog"]

之后我们动态设置就可以了

  1. version: '3.8'
  2. services:
  3. # EnianBlog 应用服务
  4. enian_blog:
  5. image: hslr/enian_blog:latest
  6. container_name: enian_blog
  7. ports:
  8. - "8080:8080"
  9. volumes:
  10. # 持久化配置文件
  11. - ./conf:/app/conf
  12. # 持久化上传文件
  13. - ./upload:/app/static/upload
  14. # 持久化session数据
  15. - ./tmp:/app/tmp
  16. # 持久化SQLite数据库(如果使用SQLite)
  17. - ./data:/app/data
  18. environment:
  19. - TZ=Asia/Shanghai
  20. restart: unless-stopped
  21. networks:
  22. - enian_network