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:
1 parent
99efa93bd3
commit
4936db3c47
4 files changed
+90
-5
No files matched your search
@@ -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"}])
|
||||
Reference in new issue
Block a user