fix: docker 默认 runner 支持 env + 并发开通竞态复用

翻转实弹暴露的两个 #88 缺口:
- _docker_default_runner 不接受 env,_call_runner 遇 env 即 loud fail,
  导致 sub2api 路径下所有 docker 任务失败(xcmapi 路径不传 env,
  此前未暴露)。默认 runner 现接受 env 并与进程环境合并后传给
  docker CLI 子进程(-e <名> 由此解析,值绝不进 argv)。
- 同一用户两任务并发开通时建号撞 email 已存在:现轮询复用
  胜出者入库的行,等不到再原错抛出。
测试:sub2api 16、docker 沙箱 29;全量 cloud 789(4 跳过)、
host 65、deploy 19 全绿。
This commit is contained in:
host committed 2026-10-27 17:59:04 +08:00
1 parent 99efa93bd3
commit 4936db3c47
4 files changed
+90 -5

No files matched your search

+13 -3
View File
@@ -1382,10 +1382,20 @@ def _parse_host_result(task_id, fake):
}
def _docker_default_runner(cmd, timeout=None):
"""docker 的默认 runner:subprocess.run,支持 timeout。"""
def _docker_default_runner(cmd, timeout=None, env=None):
"""docker 的默认 runner:subprocess.run,支持 timeout 与 env。
env 非空时与当前进程环境合并后传给 docker CLI 子进程
(-e <名> 的密钥值由此解析,绝不进 argv;只替换不合并会
丢 PATH/HOME,docker CLI 本身都跑不起来)。#88 只给
_call_runner 加了 env 透传却没给默认 runner 加 env 参数,
导致生产 docker 任务一律 loud fail,本补丁补上。
"""
full_env = dict(os.environ)
if env:
full_env.update(env)
return subprocess.run(cmd, capture_output=True, text=True,
timeout=timeout)
timeout=timeout, env=full_env)
class CloudExecutor(Executor):