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

+25
View File
@@ -336,3 +336,28 @@ class TestDockerExtraMounts(DockerCommandTestCase):
DockerExecutor("/fake/host.py", extra_mounts=["/tmp:/app"])
with self.assertRaises(ValueError):
DockerExecutor("/fake/host.py", extra_mounts=["/nonexistent-xyz:/x"])
class TestDockerDefaultRunnerEnv(unittest.TestCase):
def test_env_merged_not_replaced(self):
from cloud.sandbox import _docker_default_runner
out = _docker_default_runner(
["python3", "-c",
"import os,sys;sys.stdout.write("
"os.environ.get('PROBE_X','')+':'+"
"('1' if os.environ.get('PATH') else '0'))"],
env={"PROBE_X": "42"})
self.assertEqual(out.returncode, 0)
self.assertEqual(out.stdout, "42:1")
def test_call_runner_passes_env_to_default_runner(self):
seen = []
def recording(cmd, timeout=None, env=None):
seen.append(env)
return SimpleNamespace(returncode=0, stdout="", stderr="")
ex = DockerExecutor("/fake/host.py", runner=recording,
env={"XCM_API_KEY": "placeholder-not-a-real-key"})
ex._call_runner(["docker", "version"], env={"SUB2API_API_KEY": "x"})
self.assertEqual(seen, [{"SUB2API_API_KEY": "x"}])