@@ -631,54 +631,79 @@ def test_sync_dockerfile_build_uses_remote_context_by_default(monkeypatch, tmp_p
631631 assert captured [0 ].context_manifest .context_mode == "sparse"
632632
633633
634- def test_sync_docker_image_exact_reuse_skips_docker_save (monkeypatch ):
634+ @pytest .mark .anyio
635+ @pytest .mark .parametrize ("use_async" , [False , True ], ids = ["sync" , "async" ])
636+ @pytest .mark .parametrize ("path_override" , [None , "/request/bin:/usr/bin" , "" ])
637+ async def test_docker_image_exact_reuse_preserves_env_without_docker_save (
638+ monkeypatch , use_async , path_override
639+ ):
635640 cleaned = []
636641 source = image_build .DockerImageManifestSource (
637642 image_digest = "sha256:" + "a" * 64 ,
638643 config = {
639644 "User" : "node" ,
640- "Env" : ["APP_ENV=prod" ],
645+ "Env" : [
646+ "APP_ENV=prod" ,
647+ "PATH=/opt/venv/bin:/usr/bin" ,
648+ "VIRTUAL_ENV=/opt/venv" ,
649+ "HOME=/ignored" ,
650+ "SANDBOX_ENABLED=false" ,
651+ ],
641652 "Entrypoint" : ["node" ],
642653 "Cmd" : ["server.js" ],
643654 "WorkingDir" : "/app" ,
644655 },
645656 cleanup_callback = lambda : cleaned .append (True ),
646657 )
658+ module = async_sandbox_module if use_async else sync_sandbox_module
647659 monkeypatch .setattr (
648- sync_sandbox_module ,
660+ module ,
649661 "prepare_docker_image_manifest_source" ,
650662 lambda * args , ** kwargs : source ,
651663 )
652664 monkeypatch .setattr (
653- sync_sandbox_module ,
665+ module ,
654666 "package_docker_image_manifest" ,
655667 lambda * args , ** kwargs : pytest .fail ("cache hit unexpectedly ran docker save" ),
656668 )
657- manager = SandboxManager (
669+ manager_class = AsyncSandboxManager if use_async else SandboxManager
670+ manager = manager_class (
658671 SimpleNamespace (timeout = 30 , config = SimpleNamespace (runtime_proxy_override = None ))
659672 )
660673 reused = []
674+
675+ def reuse (params ):
676+ reused .append (params )
677+ return SimpleNamespace (hit = True , build = _image_build ("completed" ))
678+
679+ async def reuse_async (params ):
680+ return reuse (params )
681+
661682 monkeypatch .setattr (
662- manager ,
663- "reuse_docker_image" ,
664- lambda params : (
665- reused .append (params )
666- or SimpleNamespace (hit = True , build = _image_build ("completed" ))
667- ),
683+ manager , "reuse_docker_image" , reuse_async if use_async else reuse
668684 )
685+ overrides = {"APP_ENV" : "test" }
686+ if path_override is not None :
687+ overrides ["PATH" ] = path_override
669688
670689 result = manager .build_image_from_docker_image (
671690 docker_image = "local/app:latest" ,
672691 image_name = "custom" ,
673- image_init = {"env" : { "APP_ENV" : "test" } , "working_dir" : "/srv" },
692+ image_init = {"env" : overrides , "working_dir" : "/srv" },
674693 builder_cpus = 8 ,
675694 builder_memory_mib = 16384 ,
676695 )
696+ if use_async :
697+ result = await result
677698
678699 assert result .status == "completed"
679700 assert reused [0 ].source_image_digest == "sha256:" + "a" * 64
680701 assert reused [0 ].image_config_user == "node"
681- assert reused [0 ].image_init .env == {"APP_ENV" : "test" }
702+ assert reused [0 ].image_init .env == {
703+ "APP_ENV" : "test" ,
704+ "VIRTUAL_ENV" : "/opt/venv" ,
705+ "PATH" : "/opt/venv/bin:/usr/bin" if path_override is None else path_override ,
706+ }
682707 assert reused [0 ].image_init .args == ["node" , "server.js" ]
683708 assert reused [0 ].image_init .working_dir == "/srv"
684709 assert cleaned == [True ]
0 commit comments