Skip to content

Commit c36d3d9

Browse files
authored
Preserve Docker image PATH during sandbox imports (#131)
* Preserve Docker image PATH during sandbox imports * Bump version from 1.9.0 to 1.9.1
1 parent 8b431f3 commit c36d3d9

3 files changed

Lines changed: 39 additions & 15 deletions

File tree

‎hyperbrowser/client/managers/sandboxes/image_build.py‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
"USER",
6666
"LOGNAME",
6767
"SHELL",
68-
"PATH",
6968
"PWD",
7069
"DISPLAY",
7170
}

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "hyperbrowser"
3-
version = "1.9.0"
3+
version = "1.9.1"
44
description = "Python SDK for hyperbrowser"
55
authors = ["Nikhil Shahi <nshahi1998@gmail.com>"]
66
license = "MIT"

‎tests/test_sandbox_image_build_helpers.py‎

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)