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

Daz*_*ylz 5 python datetime python-3.x docker

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

import datetime
datetime.datetime.now()
datetime.datetime(2019, 8, 3, 17, 26, 25, 662809)
Run Code Online (Sandbox Code Playgroud)

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

但是,我的脚本中有这个打印语句:

print("Updating....", datetime.datetime.now())
Run Code Online (Sandbox Code Playgroud)

但是,这给了我错误的时区(休息 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
Run Code Online (Sandbox Code Playgroud)

这是我的 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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

-v /etc/localtime:/etc/localtime

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

volumes:
    - /etc/localtime:/etc/localtime
Run Code Online (Sandbox Code Playgroud)


Nei*_*eil 2

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

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

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

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

  • 对于那些想知道他想说什么的人,他告诉您添加此行`ENV TZ =“非洲/卢萨卡”`。谢谢。@尼尔 (2认同)