diff --git a/code_sandboxes/__version__.py b/code_sandboxes/__version__.py index e9139df..b8045f5 100644 --- a/code_sandboxes/__version__.py +++ b/code_sandboxes/__version__.py @@ -1 +1 @@ -__version__ = "1.11.2" +__version__ = "1.11.3" diff --git a/code_sandboxes/environments/adapters/datalayer.py b/code_sandboxes/environments/adapters/datalayer.py index 430930b..e8fed0e 100644 --- a/code_sandboxes/environments/adapters/datalayer.py +++ b/code_sandboxes/environments/adapters/datalayer.py @@ -250,6 +250,10 @@ def _contract_user() -> list[str]: f"else useradd -u {uid} -g {gid} -d {home} -s /bin/bash {user}; fi " f"&& mkdir -p {home}/content {home}/.local/share/jupyter/runtime/external_kernels " f"&& chown -R {uid}:{gid} {home}", + # The config comes from the base's channel, which may start a kernel + # elsewhere; conformance:2 reads the kernel's cwd. + f"RUN echo \"c.MappingKernelManager.root_dir = '{contract.workdir}'\" " + ">> /usr/local/share/jupyter_config.py", f"ENV HOME={home} LANG={contract.locale} LC_ALL={contract.locale} " f"LANGUAGE={contract.locale} TZ=Etc/UTC PATH=$PATH:/opt/datalayer/bin", 'ENTRYPOINT ["/opt/datalayer/bin/tini", "-g", "--"]', diff --git a/tests/test_environment_foreign_contract_layer.py b/tests/test_environment_foreign_contract_layer.py index ce006a6..baf1a79 100644 --- a/tests/test_environment_foreign_contract_layer.py +++ b/tests/test_environment_foreign_contract_layer.py @@ -500,3 +500,12 @@ def test_the_doctor_of_an_older_base_finds_its_working_directory(): created = next(line for line in _contract_user() if "external_kernels" in line) assert "/home/datalayer/content" in created assert created.index("/home/datalayer/content") < created.index("chown -R") + + +def test_the_kernel_runs_in_the_contracts_working_directory(): + """`/usr/local/share/jupyter_config.py` is the channel's own, and a channel's + may start a kernel elsewhere: conformance:2 reads the kernel's cwd.""" + from code_sandboxes.environments.adapters.datalayer import _contract_user + + pinned = next(line for line in _contract_user() if "MappingKernelManager.root_dir" in line) + assert "/home/datalayer" in pinned and "/usr/local/share/jupyter_config.py" in pinned