From 4eff6e9f41de3b65b86f85b5bc8499541e546e26 Mon Sep 17 00:00:00 2001 From: Mish <10400064+mishushakov@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:38:11 +0100 Subject: [PATCH 1/5] moved configuration files to /root (as legacy) and match user in docker --- template/build_docker.py | 2 +- template/build_prod.py | 2 +- template/build_test.py | 6 +++--- template/start-up.sh | 4 ++-- template/template.py | 24 +++++++++++++++++------- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/template/build_docker.py b/template/build_docker.py index 17c17098..7d1438a8 100644 --- a/template/build_docker.py +++ b/template/build_docker.py @@ -1,5 +1,5 @@ from template import make_template from e2b import Template -tmp = make_template(kernels=["python", "javascript"]) +tmp = make_template(kernels=["python", "javascript"], is_docker=True) print(Template.to_dockerfile(tmp)) diff --git a/template/build_prod.py b/template/build_prod.py index d88c447d..5274d8c4 100644 --- a/template/build_prod.py +++ b/template/build_prod.py @@ -5,7 +5,7 @@ load_dotenv() Template.build( - make_template(set_user_workdir=True), + make_template(), alias="code-interpreter-v1", cpu_count=2, memory_mb=2048, diff --git a/template/build_test.py b/template/build_test.py index 2e228785..a11128ca 100644 --- a/template/build_test.py +++ b/template/build_test.py @@ -5,9 +5,9 @@ load_dotenv() Template.build( - make_template(kernels=["python", "javascript"], set_user_workdir=True), + make_template(kernels=["python", "javascript"]), alias="code-interpreter-dev", - cpu_count=1, - memory_mb=1024, + cpu_count=2, + memory_mb=2048, on_build_logs=default_build_logger(min_level="debug"), ) diff --git a/template/start-up.sh b/template/start-up.sh index 81375084..d30cfc9e 100755 --- a/template/start-up.sh +++ b/template/start-up.sh @@ -13,10 +13,10 @@ function start_jupyter_server() { response=$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:8888/api/status") done - cd /.server/ + cd /root/.server/ .venv/bin/uvicorn main:app --host 0.0.0.0 --port 49999 --workers 1 --no-access-log --no-use-colors --timeout-keep-alive 640 } echo "Starting Code Interpreter server..." start_jupyter_server & -MATPLOTLIBRC=.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 +MATPLOTLIBRC=/root/.config/matplotlib/.matplotlibrc jupyter server --IdentityProvider.token="" >/dev/null 2>&1 diff --git a/template/template.py b/template/template.py index 36234506..6666ccb0 100644 --- a/template/template.py +++ b/template/template.py @@ -3,7 +3,7 @@ def make_template( kernels: list[str] = ["python", "r", "javascript", "deno", "bash", "java"], - set_user_workdir: bool = False, + is_docker: bool = False, ): enabled_kernels = set(["python", "javascript"] + kernels) # Start with base template @@ -11,7 +11,7 @@ def make_template( Template() .from_image("python:3.12") .set_user("root") - .set_workdir("/") + .set_workdir("/root") .set_envs( { "PIP_DEFAULT_TIMEOUT": "100", @@ -117,12 +117,10 @@ def make_template( ) ) - if set_user_workdir: - template = template.set_user("user").set_workdir("/home/user") - # Copy configuration files template = ( - template.copy("matplotlibrc", ".config/matplotlib/.matplotlibrc") + template + .copy("matplotlibrc", ".config/matplotlib/.matplotlibrc") .copy("start-up.sh", ".jupyter/start-up.sh") .run_cmd("chmod +x .jupyter/start-up.sh") .copy("jupyter_server_config.py", ".jupyter/") @@ -131,6 +129,18 @@ def make_template( .copy("startup_scripts", ".ipython/profile_default/startup") ) + if is_docker: + # create user user and /home/user + template = template.run_cmd("useradd -m user") + template = template.run_cmd("mkdir -p /home/user") + template = template.run_cmd("chown -R user:user /home/user") + # add to sudoers + template = template.run_cmd("echo 'user ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers") + # own everything in /root to user + template = template.run_cmd("chown -R user:user /root") + + template = template.set_user("user").set_workdir("/home/user") + return template.set_start_cmd( - ".jupyter/start-up.sh", wait_for_url("http://localhost:49999/health") + "sudo /root/.jupyter/start-up.sh", wait_for_url("http://localhost:49999/health") ) From f05669a81d0b5f3e46daac8a4d4f68d75414befd Mon Sep 17 00:00:00 2001 From: Mish <10400064+mishushakov@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:39:44 +0100 Subject: [PATCH 2/5] fix ci --- template/build_ci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/build_ci.py b/template/build_ci.py index 7455836d..1c89b472 100644 --- a/template/build_ci.py +++ b/template/build_ci.py @@ -3,7 +3,7 @@ from template import make_template Template.build( - make_template(set_user_workdir=True), + make_template(), alias=os.environ["E2B_TESTS_TEMPLATE"], cpu_count=2, memory_mb=2048, From 0f7b3ace87a7b51d492ad1f09e69c9bd2e8b7ff8 Mon Sep 17 00:00:00 2001 From: Mish <10400064+mishushakov@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:59:19 +0100 Subject: [PATCH 3/5] use absolute env paths --- template/template.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/template/template.py b/template/template.py index 6666ccb0..45190c15 100644 --- a/template/template.py +++ b/template/template.py @@ -17,9 +17,9 @@ def make_template( "PIP_DEFAULT_TIMEOUT": "100", "PIP_DISABLE_PIP_VERSION_CHECK": "1", "PIP_NO_CACHE_DIR": "1", - "JUPYTER_CONFIG_PATH": ".jupyter", - "IPYTHON_CONFIG_PATH": ".ipython", - "SERVER_PATH": ".server", + "JUPYTER_CONFIG_PATH": "/root/.jupyter", + "IPYTHON_CONFIG_PATH": "/root/.ipython", + "SERVER_PATH": "/root/.server", "JAVA_VERSION": "11", "JAVA_HOME": "/usr/lib/jvm/jdk-${JAVA_VERSION}", "IJAVA_VERSION": "1.3.0", From 71c144e20f779eb91c10ba0caa623c88c3c0af20 Mon Sep 17 00:00:00 2001 From: Mish <10400064+mishushakov@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:59:31 +0100 Subject: [PATCH 4/5] lint --- template/template.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/template/template.py b/template/template.py index 45190c15..e099dea7 100644 --- a/template/template.py +++ b/template/template.py @@ -119,8 +119,7 @@ def make_template( # Copy configuration files template = ( - template - .copy("matplotlibrc", ".config/matplotlib/.matplotlibrc") + template.copy("matplotlibrc", ".config/matplotlib/.matplotlibrc") .copy("start-up.sh", ".jupyter/start-up.sh") .run_cmd("chmod +x .jupyter/start-up.sh") .copy("jupyter_server_config.py", ".jupyter/") @@ -135,7 +134,9 @@ def make_template( template = template.run_cmd("mkdir -p /home/user") template = template.run_cmd("chown -R user:user /home/user") # add to sudoers - template = template.run_cmd("echo 'user ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers") + template = template.run_cmd( + "echo 'user ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers" + ) # own everything in /root to user template = template.run_cmd("chown -R user:user /root") From 2e068f1b6e7da6cef1d28b54d15cd82f65364763 Mon Sep 17 00:00:00 2001 From: Mish <10400064+mishushakov@users.noreply.github.com> Date: Tue, 11 Nov 2025 16:28:07 +0100 Subject: [PATCH 5/5] remove user ownership for /root --- template/template.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/template/template.py b/template/template.py index e099dea7..7fb2f1e0 100644 --- a/template/template.py +++ b/template/template.py @@ -137,8 +137,6 @@ def make_template( template = template.run_cmd( "echo 'user ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers" ) - # own everything in /root to user - template = template.run_cmd("chown -R user:user /root") template = template.set_user("user").set_workdir("/home/user")