我正在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运行脚本,现在可以运行吗?
答案 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)的评论。