繁体   English   中英

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

[英]Running python script inside Docker container wrong timezone

我在 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 小时)。

在此处输入图像描述

这是我的 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 运行脚本,现在可以了吗?

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

-v /etc/localtime:/etc/localtime

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

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

不久前,我被同样的问题所困扰。 不幸的是,我不记得最终起作用的确切修复。 但这里有一些提示:

1) 问题出在 Docker 上,而不是 Python 或日期时间或其他任何东西。 Docker 容器很难知道时间是什么时候。 您要搜索的是将容器内的时间与主机同步的方法。

2)在容器中处理时间有很多建议的方法,但我记得它们都是各种变通方法。 最后我检查了没有明确的解决方案。

3)我强烈建议您不要将 cron 作业放入容器中。 如果您需要在某个时间运行某些东西,请将 cron 放在主机上,并在需要时让它们启动容器。 这要可靠得多。

您可以尝试在代码开头使用 time.tzset() 或者您可以使用:

import detetime
import pytz

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

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

另外,检查这个

对于大多数用户来说,在docker-compose.yml中为 Python 容器设置如下环境变量就足够了:

   environment:
      TZ: America/New_York

这是用 CPython 3.8 测试的。 请记住重新创建,而不仅仅是在设置后重新启动容器。


图片来源:Harsh Nagarkar 的评论。

非常奇怪的是,我有一个 python 脚本将时间写入日志(以及其他内容)。

import time 
print(time.strftime("%c"))

例如,将返回“2022 年 3 月 15 日星期二 14:25:31”。 如果我连接到容器并启动 python3 并手动执行命令,它会返回“2022 年 3 月 15 日星期二 15:25:31”

容器将时区设置为 TZ 参数,如果我从容器中的 shell 运行“日期”,时间确实是预期的本地时间。 如果我省略 TZ,它将恢复为 UTC 时间。

我被迫将 TZ 作为参数传递给 python 脚本并进行处理。

import time
import os
os.environ['TZ'] = a
time.tzset()
print(time.strftime("%c"))

其中“a”是传递的参数

在我的 github 项目中很清楚: https://github.com/TrueOsiris/docker-godaddypy因为它只有一个 Dockerfile、一个 bash 脚本和一个 python 脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM