fix(docker): 修复 Docker 环境中的日志缓冲和证书问题

This commit is contained in:
hkfires
2025-08-03 11:31:08 +08:00
parent 9df3e7c8ec
commit 166337713d
3 changed files with 26 additions and 19 deletions

View File

@@ -2,7 +2,7 @@
FROM python:3.9-alpine FROM python:3.9-alpine
# 设置时区为 GMT+8 # 设置时区为 GMT+8
RUN apk add --no-cache tzdata RUN apk add --no-cache tzdata ca-certificates
ENV TZ=Asia/Shanghai ENV TZ=Asia/Shanghai
# 设置工作目录 # 设置工作目录

View File

@@ -1,11 +1,13 @@
version: '3.8'
services: services:
nodeseek-signin: nodeseek-signin:
build: . build: .
image: nodeseek-signin:latest
container_name: nodeseek-signin
command: ["python", "scheduler.py"]
environment: environment:
- IN_DOCKER=true - IN_DOCKER=true
env_file: env_file:
- .env - .env
volumes: volumes:
- ./cookie:/app/cookie - ./cookie:/app/cookie
restart: always restart: always

View File

@@ -1,4 +1,5 @@
import os import os
import sys
import time import time
import datetime import datetime
import random import random
@@ -6,6 +7,10 @@ import subprocess
import re import re
from datetime import timezone, timedelta from datetime import timezone, timedelta
# 测试程序时使用
# from dotenv import load_dotenv
# load_dotenv()
GMT8 = timezone(timedelta(hours=8)) GMT8 = timezone(timedelta(hours=8))
def get_run_config(): def get_run_config():
@@ -19,17 +24,17 @@ def get_run_config():
run_at_env = os.environ.get('RUN_AT', '08:00-10:59') run_at_env = os.environ.get('RUN_AT', '08:00-10:59')
if re.fullmatch(r'\d{2}:\d{2}', run_at_env): if re.fullmatch(r'\d{2}:\d{2}', run_at_env):
print(f"检测到固定时间模式: {run_at_env}") print(f"检测到固定时间模式: {run_at_env}", flush=True)
return 'fixed', run_at_env return 'fixed', run_at_env
if re.fullmatch(r'\d{2}:\d{2}-\d{2}:\d{2}', run_at_env): if re.fullmatch(r'\d{2}:\d{2}-\d{2}:\d{2}', run_at_env):
print(f"检测到随机时间范围模式: {run_at_env}") print(f"检测到随机时间范围模式: {run_at_env}", flush=True)
return 'range', run_at_env return 'range', run_at_env
if os.environ.get('RUN_AT'): if os.environ.get('RUN_AT'):
print(f"警告: 环境变量 RUN_AT 的格式 '{run_at_env}' 无效。") print(f"警告: 环境变量 RUN_AT 的格式 '{run_at_env}' 无效。", flush=True)
print("将使用默认随机时间范围 '08:00-10:59'") print("将使用默认随机时间范围 '08:00-10:59'", flush=True)
return 'range', '08:00-10:59' return 'range', '08:00-10:59'
def calculate_next_run_time(mode, value): def calculate_next_run_time(mode, value):
@@ -78,26 +83,26 @@ def run_checkin_task():
""" """
执行 nodeseek_sign.py 脚本。 执行 nodeseek_sign.py 脚本。
""" """
print(f"[{datetime.datetime.now(GMT8).strftime('%Y-%m-%d %H:%M:%S')}] 开始执行签到任务...") print(f"[{datetime.datetime.now(GMT8).strftime('%Y-%m-%d %H:%M:%S')}] 开始执行签到任务...", flush=True)
try: try:
subprocess.run(["python", "nodeseek_sign.py"], check=True) subprocess.run([sys.executable, "nodeseek_sign.py"], check=True)
print(f"[{datetime.datetime.now(GMT8).strftime('%Y-%m-%d %H:%M:%S')}] 签到任务执行完毕。") print(f"[{datetime.datetime.now(GMT8).strftime('%Y-%m-%d %H:%M:%S')}] 签到任务执行完毕。", flush=True)
except FileNotFoundError: except FileNotFoundError:
print("错误: 'nodeseek_sign.py' 未找到。请确保它与 scheduler.py 位于同一目录。") print("错误: 'nodeseek_sign.py' 未找到。请确保它与 scheduler.py 位于同一目录。", flush=True)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
print(f"签到任务执行失败,返回码: {e.returncode}") print(f"签到任务执行失败,返回码: {e.returncode}", flush=True)
except Exception as e: except Exception as e:
print(f"执行签到任务时发生未知错误: {e}") print(f"执行签到任务时发生未知错误: {e}", flush=True)
def main(): def main():
""" """
主调度循环。 主调度循环。
""" """
print("调度器启动...") print("调度器启动...", flush=True)
mode, value = get_run_config() mode, value = get_run_config()
print(f"调度模式: '{mode}', 配置值: '{value}'") print(f"调度模式: '{mode}', 配置值: '{value}'", flush=True)
run_checkin_task() # run_checkin_task() # 启动时执行,用于测试程序
while True: while True:
next_run_time = calculate_next_run_time(mode, value) next_run_time = calculate_next_run_time(mode, value)
@@ -105,13 +110,13 @@ def main():
sleep_duration = (next_run_time - now).total_seconds() sleep_duration = (next_run_time - now).total_seconds()
if sleep_duration > 0: if sleep_duration > 0:
print(f"下一次签到任务计划在: {next_run_time.strftime('%Y-%m-%d %H:%M:%S')}") print(f"下一次签到任务计划在: {next_run_time.strftime('%Y-%m-%d %H:%M:%S')}", flush=True)
hours, remainder = divmod(sleep_duration, 3600) hours, remainder = divmod(sleep_duration, 3600)
minutes, _ = divmod(remainder, 60) minutes, _ = divmod(remainder, 60)
print(f"程序将休眠 {int(hours)} 小时 {int(minutes)} 分钟。") print(f"程序将休眠 {int(hours)} 小时 {int(minutes)} 分钟。", flush=True)
time.sleep(sleep_duration) time.sleep(sleep_duration)
else: else:
print("计算出的下一个运行时间已过,等待 60 秒后重试...") print("计算出的下一个运行时间已过,等待 60 秒后重试...", flush=True)
time.sleep(60) time.sleep(60)
run_checkin_task() run_checkin_task()