• [转]解决Docker容器时间与主机不一致问题


    原文: https://blog.csdn.net/luckystar689/article/details/76572046

    https://stackoverflow.com/questions/35994349/php-date-timezone-not-found-with-docker-php-fpm

    2down voteaccepted

    Official PHP Docker Image use /usr/local/etc/php as base folder: see Dockerfile.

    'm creating a Symfony environment (PHP-FPM, Nginx, & more) with Docker & Docker-compose.

    But, PHP does not use my php.ini and ignores the config (date.timezone parameter is not found in my Symfony application).

    Of course, when I go on my container, the date.timezone is correctly set in the 2 php.ini (cli & FPM).

    I don't understand why, but it works if I put my php.ini in /usr/local/etc/php/ folder (wtf)

    Did I miss something?

    docker-compose.yml :

    nginx:
        image: nginx
        volumes:
            - "./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro"
        links:
            - "php:php"
        ports:
            - "80:80"
            - "443:443"
        working_dir: "/etc/nginx"
    
    php:
        build: docker/php
        volumes:
            - ".:/var/www:rw"
        working_dir: "/var/www"

    Dockerfile :

    FROM php:5-fpm
    
    ENV DEBIAN_FRONTEND noninteractive
    
    RUN apt-get update && 
        apt-get install -y php5-common php5-fpm php5-cli php5-mysql php5-apcu php5-intl php5-imagick && 
        apt-get clean && 
        rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
    RUN sed -i 's/;date.timezone =/date.timezone = "Europe/Paris"/g' /etc/php5/fpm/php.ini
    RUN sed -i 's/;date.timezone =/date.timezone = "Europe/Paris"/g' /etc/php5/cli/php.ini
    
    RUN usermod -u 1000 www-data

    ---------------------------------------------------------------------------------

    目录

    背景

    公司做的项目是部署到dockerize的tomcat容器上的,将日志映射到了宿主机器的某个目录下,但是出现了一个问题,那就是日志打印的时间有问题,会比宿主机的时间晚8个小时。

    解决方法

    一、先查看服务器和容器时区设置是否一致:

    这里写图片描述

    1、docker容器内的时区是UTC 
    2、主机的时区是CTS

    二、这两个时区有什么不同呢?

    GPS 系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的时间,地方时为本地时间,如北京为早上八点(东八区),UTC时间就为零点,时间比北京时晚八小时

    CTS: 
    China Standard Time,UTC+8:00 中国沿海时间(北京时间) 
    UTC: 
    Universal Time Coordinated 世界协调时间

    三、如何解决?(设置时区一致)

    解决的时候做了三种尝试:

    第一次在服务镜像所依赖的镜像tomcat的Dockerfile中加入如下设置:

    RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
    && echo 'Asia/Shanghai' >/etc/timezone
    • 1
    • 2

    重新构建镜像,启动容器,发现和此tomcat镜像在同一台服务器上的服务时区和时间均修改成功,但是不在同一台服务器上的docker容器还是UTC时区,时间不一致。

    第二次,容器启动的时候挂个参数,让其使用主机服务器上的时间:

    docker run -d --name demo-service --rm -p 8084:8080 -v /usr/local/tomcat/logs/tomcat8080:/usr/local/tomcat/logs -v /etc/localtime:/etc/localtime demo-service:1.0.0
    • 1

    其中加入的 -v /etc/localtime:/etc/localtime就是时间的设置,设置好后,启动容器,进入容器内部,打date命令,输出的时间和主机时间一样,然后查看tomcat日志,发现日志的时间没有变还是比主机晚8个小时。

    于是,寻求另一种解决办法。

    第三次,在各个服务的Dockerfile中加入对时区和时间的设置,如第一次尝试的Dockerfile中加入的内容。

    重新使用Jenkins构建服务,实验成功!

     
  • 相关阅读:
    OpenCV 图像二值化 threshold
    C++ pow()函数
    Marr-Hildreth 边缘检测 OpenCV C++实现
    OpenCV 边缘检测 Canny
    OpenCV Canny()函数
    OpenCV Sobel()函数
    OpenCV 边缘检测 Sobel
    OpenCV 边缘检测 Laplacian
    OpenCV 边缘检测 Scharr
    OpenCV 形态学变换 morphologyEx函数
  • 原文地址:https://www.cnblogs.com/oxspirt/p/9022920.html
Copyright © 2020-2023  润新知