From 3cff926f49405be537d92fd4e07cdec938bbdd88 Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 18 Jun 2026 15:59:56 +0100 Subject: [PATCH 1/4] Ext as default shell --- .github/workflows/docker.yml | 4 --- .gitignore | 2 ++ Dockerfile.astera | 11 ++++--- README.md | 1 - docker/astera/ext-config.toml | 2 ++ docker/astera/install-ext-shell-hooks.sh | 18 +++++++++++ docker/astera/install-ext.sh | 8 +++++ docker/astera/sampleworks-ext-shell.sh | 40 ++++++++++++++++++++++++ 8 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 docker/astera/ext-config.toml create mode 100644 docker/astera/install-ext-shell-hooks.sh create mode 100644 docker/astera/install-ext.sh create mode 100644 docker/astera/sampleworks-ext-shell.sh diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d6b3944c..478acb10 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -24,9 +24,6 @@ env: ASTERA_REGISTRY: harbor.astera.sh ASTERA_IMAGE_NAME: library/pixi-with-checkpoints SKOPEO_IMAGE: quay.io/skopeo/stable@sha256:2bfc4bce3224a5940708fbaf7c161a2ef395ab272b568b3abfaf3ca48164b63d - # Update this only when the Astera overlay needs a newer EXT CLI; otherwise the - # repo variable can override it without changing this workflow. - EXT_CLI_IMAGE: ${{ vars.EXT_CLI_IMAGE || 'harbor.astera.sh/library/ext-cli:sha-724abde27fdfa15b23adb112d2e1dc83dd533a57' }} DOCKER_METADATA_SHORT_SHA_LENGTH: 7 @@ -225,7 +222,6 @@ jobs: labels: ${{ steps.astera-meta.outputs.labels }} build-args: | PIXI_WITH_CHECKPOINTS_IMAGE=${{ needs.public.outputs.image-ref }} - EXT_CLI_IMAGE=${{ env.EXT_CLI_IMAGE }} cache-from: type=registry,ref=${{ env.ASTERA_REGISTRY }}/${{ env.ASTERA_IMAGE_NAME }}:buildcache cache-to: type=registry,ref=${{ env.ASTERA_REGISTRY }}/${{ env.ASTERA_IMAGE_NAME }}:buildcache,mode=max provenance: false diff --git a/.gitignore b/.gitignore index 7fe84d3c..f678b659 100644 --- a/.gitignore +++ b/.gitignore @@ -231,3 +231,5 @@ initial_dataset_40*/ # Reinclude !src/sampleworks/data/protein_configs.csv + +.idea diff --git a/Dockerfile.astera b/Dockerfile.astera index 69be1db5..fb6adfc5 100644 --- a/Dockerfile.astera +++ b/Dockerfile.astera @@ -13,9 +13,6 @@ # . ARG PIXI_WITH_CHECKPOINTS_IMAGE -ARG EXT_CLI_IMAGE=harbor.astera.sh/library/ext-cli:sha-724abde27fdfa15b23adb112d2e1dc83dd533a57 - -FROM ${EXT_CLI_IMAGE} AS ext-cli FROM ${PIXI_WITH_CHECKPOINTS_IMAGE} AS astera @@ -57,9 +54,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ command -v "${cmd}" >/dev/null 2>&1 || exit 1; \ done -COPY --from=ext-cli /ext /usr/local/bin/ext +COPY docker/astera/ /usr/local/share/sampleworks/astera/ -RUN chmod 0755 /usr/local/bin/ext +RUN install -m 0644 \ + /usr/local/share/sampleworks/astera/sampleworks-ext-shell.sh \ + /etc/profile.d/sampleworks-ext-shell.sh \ + && bash /usr/local/share/sampleworks/astera/install-ext.sh \ + && bash /usr/local/share/sampleworks/astera/install-ext-shell-hooks.sh WORKDIR /home/dev diff --git a/README.md b/README.md index 7ea4bb0a..273fc884 100644 --- a/README.md +++ b/README.md @@ -322,7 +322,6 @@ CI configuration variables: | `SAMPLEWORKS_CHECKPOINTS_SOURCE_IMAGE` | Optional private/source checkpoint image that CI mirrors to Docker Hub; defaults to the current digest-pinned Harbor image | | `SAMPLEWORKS_CHECKPOINTS_DOCKERHUB_IMAGE` | Optional public Docker Hub checkpoint mirror destination tag; defaults to `docker.io/diffuseproject/sampleworks-checkpoints:latest` | | `SAMPLEWORKS_CUDA_BASE_IMAGE` | Optional digest-pinned CUDA base override | -| `EXT_CLI_IMAGE` | Optional EXT CLI image override for the Astera overlay | Build the public image locally: diff --git a/docker/astera/ext-config.toml b/docker/astera/ext-config.toml new file mode 100644 index 00000000..67ee7171 --- /dev/null +++ b/docker/astera/ext-config.toml @@ -0,0 +1,2 @@ +[process_trace] +tracer = "ebpf" diff --git a/docker/astera/install-ext-shell-hooks.sh b/docker/astera/install-ext-shell-hooks.sh new file mode 100644 index 00000000..97b28e4b --- /dev/null +++ b/docker/astera/install-ext-shell-hooks.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -euo pipefail + +profile_script="/etc/profile.d/sampleworks-ext-shell.sh" +profile_comment="# Sampleworks: enter an EXT-tracked shell for interactive ACTL/SSH sessions." +profile_line="[ -r ${profile_script} ] && . ${profile_script}" + +touch /root/.bashrc /home/dev/.bashrc + +for profile_file in /etc/bash.bashrc /root/.bashrc /home/dev/.bashrc /etc/zsh/zshrc /etc/zsh/zprofile; do + if [ ! -e "${profile_file}" ]; then + continue + fi + if grep -Fqs "${profile_line}" "${profile_file}"; then + continue + fi + printf '\n%s\n%s\n' "${profile_comment}" "${profile_line}" >> "${profile_file}" +done diff --git a/docker/astera/install-ext.sh b/docker/astera/install-ext.sh new file mode 100644 index 00000000..5d69b2dc --- /dev/null +++ b/docker/astera/install-ext.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail + +curl -fsSL https://extshell.org/install.sh | bash +install -d -m 0755 /home/dev/.local/share/ext +install -m 0644 /usr/local/share/sampleworks/astera/ext-config.toml /home/dev/.local/share/ext/config.toml +command -v ext >/dev/null 2>&1 +ext --help >/dev/null diff --git a/docker/astera/sampleworks-ext-shell.sh b/docker/astera/sampleworks-ext-shell.sh new file mode 100644 index 00000000..8ea35f57 --- /dev/null +++ b/docker/astera/sampleworks-ext-shell.sh @@ -0,0 +1,40 @@ +# Start ext only for real interactive terminal sessions. Non-interactive +# commands such as `actl pod exec -- ...`, CI, and VS Code server probes must +# keep their original process shape. +case "$-" in + *i*) ;; + *) return 0 2>/dev/null || exit 0 ;; +esac + +[ -t 0 ] || return 0 2>/dev/null || exit 0 +[ -t 1 ] || return 0 2>/dev/null || exit 0 +[ -z "${SAMPLEWORKS_DISABLE_EXT_SHELL:-}" ] || return 0 2>/dev/null || exit 0 +[ -z "${SAMPLEWORKS_EXT_SHELL_ATTEMPTED:-}" ] || return 0 2>/dev/null || exit 0 +[ -z "${EXT_SHELL_ACTIVE:-}" ] || return 0 2>/dev/null || exit 0 +[ -z "${BASH_EXECUTION_STRING:-}" ] || return 0 2>/dev/null || exit 0 +[ -z "${ZSH_EXECUTION_STRING:-}" ] || return 0 2>/dev/null || exit 0 +command -v ext >/dev/null 2>&1 || return 0 2>/dev/null || exit 0 + +__sampleworks_ext_config_template="/usr/local/share/sampleworks/astera/ext-config.toml" +__sampleworks_ext_data_home="${XDG_DATA_HOME:-${HOME:-/home/dev}/.local/share}" +__sampleworks_ext_config_dir="${__sampleworks_ext_data_home}/ext" +__sampleworks_ext_config="${__sampleworks_ext_config_dir}/config.toml" +mkdir -p "${__sampleworks_ext_config_dir}" 2>/dev/null || true +if [ ! -e "${__sampleworks_ext_config}" ] && [ -r "${__sampleworks_ext_config_template}" ]; then + cp "${__sampleworks_ext_config_template}" "${__sampleworks_ext_config}" 2>/dev/null || true +fi +unset __sampleworks_ext_config_template __sampleworks_ext_data_home +unset __sampleworks_ext_config_dir __sampleworks_ext_config + +__sampleworks_ext_shell="" +if [ -n "${BASH_VERSION:-}" ]; then + __sampleworks_ext_shell="bash" +elif [ -n "${ZSH_VERSION:-}" ]; then + __sampleworks_ext_shell="zsh" +fi + +if [ -n "${__sampleworks_ext_shell}" ]; then + export SAMPLEWORKS_EXT_SHELL_ATTEMPTED=1 + exec ext shell -shell "${__sampleworks_ext_shell}" +fi +unset __sampleworks_ext_shell From c21aaf78e47828e75f8846f1f052909cb47a14a8 Mon Sep 17 00:00:00 2001 From: Denis Date: Mon, 22 Jun 2026 19:27:22 +0100 Subject: [PATCH 2/4] Review fixes --- Dockerfile.astera | 4 +++- docker/astera/install-ext.sh | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Dockerfile.astera b/Dockerfile.astera index fb6adfc5..340a9bd3 100644 --- a/Dockerfile.astera +++ b/Dockerfile.astera @@ -16,6 +16,8 @@ ARG PIXI_WITH_CHECKPOINTS_IMAGE FROM ${PIXI_WITH_CHECKPOINTS_IMAGE} AS astera +ARG EXT_VERSION=v0.1.1 + ENV DEBIAN_FRONTEND=noninteractive \ HOME=/home/dev \ XDG_CONFIG_HOME=/home/dev/.config \ @@ -59,7 +61,7 @@ COPY docker/astera/ /usr/local/share/sampleworks/astera/ RUN install -m 0644 \ /usr/local/share/sampleworks/astera/sampleworks-ext-shell.sh \ /etc/profile.d/sampleworks-ext-shell.sh \ - && bash /usr/local/share/sampleworks/astera/install-ext.sh \ + && EXT_VERSION="${EXT_VERSION}" bash /usr/local/share/sampleworks/astera/install-ext.sh \ && bash /usr/local/share/sampleworks/astera/install-ext-shell-hooks.sh WORKDIR /home/dev diff --git a/docker/astera/install-ext.sh b/docker/astera/install-ext.sh index 5d69b2dc..57f0837a 100644 --- a/docker/astera/install-ext.sh +++ b/docker/astera/install-ext.sh @@ -1,7 +1,10 @@ #!/usr/bin/env bash set -euo pipefail -curl -fsSL https://extshell.org/install.sh | bash +EXT_VERSION="${EXT_VERSION:-v0.1.1}" +EXT_INSTALL_DIR="${EXT_INSTALL_DIR:-/usr/local/bin}" + +curl -fsSL https://extshell.org/install.sh | bash -s -- --version "${EXT_VERSION}" --dir "${EXT_INSTALL_DIR}" install -d -m 0755 /home/dev/.local/share/ext install -m 0644 /usr/local/share/sampleworks/astera/ext-config.toml /home/dev/.local/share/ext/config.toml command -v ext >/dev/null 2>&1 From aa3ecbae0788729d1484aa75ffed768eb376a54e Mon Sep 17 00:00:00 2001 From: Denis Date: Mon, 22 Jun 2026 19:48:04 +0100 Subject: [PATCH 3/4] Review fixes --- docker/astera/sampleworks-ext-shell.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/astera/sampleworks-ext-shell.sh b/docker/astera/sampleworks-ext-shell.sh index 8ea35f57..1d92d1b5 100644 --- a/docker/astera/sampleworks-ext-shell.sh +++ b/docker/astera/sampleworks-ext-shell.sh @@ -8,7 +8,6 @@ esac [ -t 0 ] || return 0 2>/dev/null || exit 0 [ -t 1 ] || return 0 2>/dev/null || exit 0 -[ -z "${SAMPLEWORKS_DISABLE_EXT_SHELL:-}" ] || return 0 2>/dev/null || exit 0 [ -z "${SAMPLEWORKS_EXT_SHELL_ATTEMPTED:-}" ] || return 0 2>/dev/null || exit 0 [ -z "${EXT_SHELL_ACTIVE:-}" ] || return 0 2>/dev/null || exit 0 [ -z "${BASH_EXECUTION_STRING:-}" ] || return 0 2>/dev/null || exit 0 From 2a8a3437539762bb4937da70399fe2998d84a8ea Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 23 Jun 2026 20:47:49 +0100 Subject: [PATCH 4/4] Enable ext only with param --- docker/astera/install-ext-shell-hooks.sh | 2 +- docker/astera/sampleworks-ext-shell.sh | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docker/astera/install-ext-shell-hooks.sh b/docker/astera/install-ext-shell-hooks.sh index 97b28e4b..fc30b8f4 100644 --- a/docker/astera/install-ext-shell-hooks.sh +++ b/docker/astera/install-ext-shell-hooks.sh @@ -2,7 +2,7 @@ set -euo pipefail profile_script="/etc/profile.d/sampleworks-ext-shell.sh" -profile_comment="# Sampleworks: enter an EXT-tracked shell for interactive ACTL/SSH sessions." +profile_comment="# Sampleworks: enter ext when ACTL sets EXT_SHELL=1." profile_line="[ -r ${profile_script} ] && . ${profile_script}" touch /root/.bashrc /home/dev/.bashrc diff --git a/docker/astera/sampleworks-ext-shell.sh b/docker/astera/sampleworks-ext-shell.sh index 1d92d1b5..d9a2b991 100644 --- a/docker/astera/sampleworks-ext-shell.sh +++ b/docker/astera/sampleworks-ext-shell.sh @@ -1,6 +1,6 @@ -# Start ext only for real interactive terminal sessions. Non-interactive -# commands such as `actl pod exec -- ...`, CI, and VS Code server probes must -# keep their original process shape. +# Enter ext only when ACTL sets EXT_SHELL=1. +[ "${EXT_SHELL:-}" = "1" ] || return 0 2>/dev/null || exit 0 + case "$-" in *i*) ;; *) return 0 2>/dev/null || exit 0 ;; @@ -25,15 +25,15 @@ fi unset __sampleworks_ext_config_template __sampleworks_ext_data_home unset __sampleworks_ext_config_dir __sampleworks_ext_config -__sampleworks_ext_shell="" +__sampleworks_ext_inner_shell="" if [ -n "${BASH_VERSION:-}" ]; then - __sampleworks_ext_shell="bash" + __sampleworks_ext_inner_shell="bash" elif [ -n "${ZSH_VERSION:-}" ]; then - __sampleworks_ext_shell="zsh" + __sampleworks_ext_inner_shell="zsh" fi -if [ -n "${__sampleworks_ext_shell}" ]; then +if [ -n "${__sampleworks_ext_inner_shell}" ]; then export SAMPLEWORKS_EXT_SHELL_ATTEMPTED=1 - exec ext shell -shell "${__sampleworks_ext_shell}" + exec ext shell -shell "${__sampleworks_ext_inner_shell}" fi -unset __sampleworks_ext_shell +unset __sampleworks_ext_inner_shell