docker compose 使用 java:8 镜像内部时间是错误的

来源:12-1 运行第一个docker容器

牛气大志

2020-03-25

我使用的镜像依赖:FROM hub.c.163.com/library/java:8,但是这个jar运行起来,内部的date 时间比较中国时间快了几个小时。网上找了好3个方法发现都没用。服务器使用运行环境centos7、本地编译使用的是macos。
下面是几个文件的说明,请求师兄协助,本人用的是centos7

  1. Dockerfile 修改
# Dockerfile
#https://c.163yun.com/dashboard#/m/mirrorRepo/
#https://www.163yun.com/help/documents/15587826830438400
#Dockerfile 都必须以 FROM 命令开始,指定镜像基于那个集成基础镜像创建
#### 不建议使用jar形式,jar形式部署有问题,主要是:访问路径有问题 ###
#### 注意精简版是 【java:8-alpine】、完整版:【java:8】项目中有画图、验证码等必须使用完整版本
FROM hub.c.163.com/library/java:8
#FROM java:8
#FROM jboss/wildfly
MAINTAINER dazer <duandazhi@ourslook.com>
#容器内部使用是8761端口,别的端口映射出去也没用的
EXPOSE 8881
#指定文件临时目录
VOLUME /tmp
#ADD:复制文件指令,ADD <source> <destination>  复制源文件到目标文件;source 可以是 URL 或者是启动配置上下文中的一个文件
ADD ./target/*.jar app.jar
#RUN bash -c 'touch /app.jar'
#配置给容器一个可执行的命令;多个会覆盖只会执行最后的一个命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","-Duser.timezone=GMT+08","/app.jar"]

#docker 修改市区,否则docker内部时间和服务器时间不一样,比如和oracle不一致,导致无法运行
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone


  1. dockerBuild.sh修改
#!/usr/bin/env bash
#说明:docker构建的两种方式
#1:使用docker mvn插件'docker-maven-plugin'配置好serverId,直接通过插件完成build、push、tag的操作;不需要dockerfile
#2:一步步执行docker命令操作
#3:运行方式 ./dockerBuild.sh 或者 sh dockerBuild.sh

mvn clean package -Dmaven.test.skip=true -U

# 冒号指定版本0.01, 如果不指定,就是 latest
docker build -t hub.c.163.com/dazer1992/iot-platform-core:0.01 .

docker push hub.c.163.com/dazer1992/iot-platform-core

#以交互方式运行一个镜像,运行完成之后,直接删除掉容器; 注意端口 【外部映射端口:内部端口】
#docker run -it --rm -p 8002:8881 hub.c.163.com/dazer1992/iot-platform-core:0.01

  1. docker-compose.yml 修改
  iot-platform:
    image: hub.c.163.com/dazer1992/iot-platform-core:0.01
    container_name: iot-platform-core
    volumes: #磁盘映射;解决容器内和容器外时间不一致的问题
      - "/usr/share/zoneinfo/Asia/Shanghai:/usr/share/zoneinfo/Asia/Shanghai"
      - "/etc/localtime:/etc/localtime:ro"
    environment:
      TZ: Asia/Shanghai
    restart: unless-stopped
    ports:
      - "8002:8881"
    networks:
      - front
      - backend
写回答

1回答

牛气大志

提问者

2020-03-28


哎,我愚蠢到家了,改时区的方法,我全部都研究过的,也没问题。这里是错的,是因为,我服务器的宿主机,运维没有调整时间。我也没有仔细看,今天一看,宿主机的时间错的。

 ntpdate -u ntp.sjtu.edu.cn  #同步时间
 date -R #查看时区
 date #查看时间

Thanks♪(・ω・)ノ,已经解决了。

0
1
廖师兄
遇到这种问题,其实第一步,就应该检查宿主机的时间。宿主机上的软件或宿主机上的虚拟机的时间,用的都是宿主机的时间。
2020-03-28
共1条回复

SpringCloud Finchley(M2+RELEASE+SR2)微服务实战

SpringCloud组件实现微服务,【已升级Finchley.Release】

5673 学习 · 2489 问题

查看课程