在Docker容器中运行python脚本时区错误

时间:2019-08-03 15:35:10

标签: python python-3.x docker datetime

我正在Docker容器(python:3.6)内运行脚本,它在日志中显示了错误的时间。在python控制台(在容器内部)中使用以下python代码时,它为我提供了正确的时区。

import datetime
datetime.datetime.now()
datetime.datetime(2019, 8, 3, 17, 26, 25, 662809)

此外,在容器内运行date命令时,它会提供正确的时区。

但是,我的脚本中有以下打印语句:

print("Updating....", datetime.datetime.now())

但是,这给了我错误的时区(关闭2小时)。

enter image description here

这是我的docker-compose.yml:

version: '3'
services:
  app:
    container_name: app
    build: .
    restart: unless-stopped
    environment:
      TZ: Europe/Amsterdam
    depends_on:
      - db
  db:
    container_name: db
    image: mariadb
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: x
      MYSQL_DATABASE: x
      MYSQL_USER: x
      MYSQL_PASSWORD: x
      TZ: Europe/Amsterdam
    volumes:
      - /volumes/x/db:/var/lib/mysql

这是我的crontab文件(在应用容器中运行)

CRON_TZ=Europe/Amsterdam

*/5 * * * * cd /usr/src/app && /usr/local/bin/python3.6 -u -m x > /proc/1/fd/1 2>/proc/1/fd/2
0,30 * * * * cd /usr/src/app && /usr/local/bin/python3.6 -u -m x > /proc/1/fd/1 2>/proc/1/fd/2
5 0 * * * cd /usr/src/app && /usr/local/bin/python3.6 -u -m x > /proc/1/fd/1 2>/proc/1/fd/2

我尝试在docker-compose.yml中设置时区,该时区适用于date命令和python控制台。我尝试在crontab文件中设置时区,但是在脚本中它仍然没有显示正确的时区。

如何在crontab中设置Python的时区,以便日志具有正确的时区?另外,我需要在00:05而不是22:05运行脚本,现在可以运行吗?

4 个答案:

答案 0 :(得分:2)

如果您尝试将容器中的时区与主机同步,则可以从主机映射时区设置。我已成功完成以下卷:

-v /etc/localtime:/etc/localtime

或者在您的docker-compose.yml文件中:

volumes:
    - /etc/localtime:/etc/localtime

答案 1 :(得分:0)

前一段时间,我也被同样的问题所困扰。不幸的是,我不记得最终能解决的确切修复方法。但是这里有一些提示:

1)问题出在Docker,而不是Python或datetime或其他任何问题。 Docker容器很难知道现在几点了。您要搜索的是将容器内的主机时间与主机同步的方法。

2)有许多建议的方法来处理容器中的时间,但我记得它们都是类似的解决方法。最后我检查了没有明确的解决方案。

3)我强烈建议您不要将cron作业放入容器中。如果您需要某些东西在特定的时间运行,则将Cron放在主机上,并在需要时使它们旋转容器。这更加可靠。

答案 2 :(得分:0)

您可以尝试在代码的开头使用time.tzset(),也可以使用:

import detetime
import pytz

datetime.now(tz=pytz.timezone('Europe/Amsterdam'))

# or datetime.now(tz=pytz.timezone(os.environ.get('TZ'))

还要检查this

答案 3 :(得分:0)

对于大多数用户而言,在docker-compose.yml中为Python容器设置以下环境变量应该足够有效:

   environment:
      TZ: America/New_York

这已在CPython 3.8中进行了测试。记住要重新创建容器,而不仅仅是在设置之后重新启动容器。


信用:苛刻的纳加卡(Harsh Nagarkar)的评论。