From 7db1dea7578598a749f92b1c92433194f7d9cc83 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 10 Aug 2026 17:13:03 +0000 Subject: [PATCH 1/5] fx/php: install PHP 8.5 from Ubuntu, drop dead ondrej PPA The base image moved to Ubuntu resolute. The ondrej PPA has no release for it. All PHP 8.5 packages are in the Ubuntu archive. php8.5-imap is dropped: the extension left PHP core in 8.4 and has no package. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S9abShYK5RMmbeuZurGH3b --- fx/Dockerfile | 8 +++----- php/Dockerfile | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/fx/Dockerfile b/fx/Dockerfile index 10a4ccc..7436dc8 100644 --- a/fx/Dockerfile +++ b/fx/Dockerfile @@ -25,11 +25,9 @@ RUN \ # REPOS #################################################################### # Add all package repos first, then do a single apt-get update apt-get update && \ - apt-get install -y --no-install-recommends curl wget software-properties-common gpg && \ + apt-get install -y --no-install-recommends curl wget gpg && \ # Node repo curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - && \ - # PHP repo - add-apt-repository -y ppa:ondrej/php && \ # GitHub CLI repo wget -qO /tmp/githubcli-archive-keyring.gpg https://cli.github.com/packages/githubcli-archive-keyring.gpg && \ mkdir -p -m 755 /etc/apt/keyrings && \ @@ -44,7 +42,7 @@ RUN \ # Node nodejs \ # PHP - php8.5-cli php8.5-common php8.5-curl php8.5-gd php8.5-imap php8.5-intl \ + php8.5-cli php8.5-common php8.5-curl php8.5-gd php8.5-intl \ php8.5-mailparse php8.5-mbstring php8.5-mysql php8.5-pgsql php8.5-phpdbg \ php8.5-readline php8.5-redis php8.5-soap php8.5-sqlite3 php8.5-xml \ php8.5-zip php8.5-bcmath php8.5-apcu php8.5-imagick \ @@ -124,7 +122,7 @@ RUN \ # CLEANUP ################################################################### apt-get clean -y && \ apt-get autoclean -y && \ - apt-get remove -y wget software-properties-common && \ + apt-get remove -y wget && \ apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/* /var/lib/log/* /tmp/* /var/tmp/* \ /root/.npm /root/.cache /root/.local /root/.opencode /root/.bun diff --git a/php/Dockerfile b/php/Dockerfile index 2cd7139..a850703 100644 --- a/php/Dockerfile +++ b/php/Dockerfile @@ -8,11 +8,9 @@ USER root RUN \ # REPOS #################################################################### apt-get update && \ - apt-get install -y --no-install-recommends curl wget software-properties-common gpg && \ + apt-get install -y --no-install-recommends curl wget gpg && \ # Node repo (needed for npm tools) curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - && \ - # PHP repo - add-apt-repository -y ppa:ondrej/php && \ # GitHub CLI repo wget -qO /tmp/githubcli-archive-keyring.gpg https://cli.github.com/packages/githubcli-archive-keyring.gpg && \ mkdir -p -m 755 /etc/apt/keyrings && \ @@ -25,7 +23,7 @@ RUN \ apt-get install -y --no-install-recommends \ git jq ripgrep tmux nodejs \ # PHP - php8.5-cli php8.5-common php8.5-curl php8.5-gd php8.5-imap php8.5-intl \ + php8.5-cli php8.5-common php8.5-curl php8.5-gd php8.5-intl \ php8.5-mailparse php8.5-mbstring php8.5-mysql php8.5-pgsql php8.5-phpdbg \ php8.5-readline php8.5-redis php8.5-soap php8.5-sqlite3 php8.5-xml \ php8.5-zip php8.5-bcmath php8.5-apcu php8.5-imagick \ @@ -72,7 +70,7 @@ RUN \ # CLEANUP ################################################################### apt-get clean -y && \ apt-get autoclean -y && \ - apt-get remove -y wget software-properties-common && \ + apt-get remove -y wget && \ apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/* /var/lib/log/* /tmp/* /var/tmp/* \ /root/.npm /root/.cache /root/.local /root/.opencode From 58a88245f1768d97f3be681ddac787afae6f4366 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 10 Aug 2026 17:13:03 +0000 Subject: [PATCH 2/5] opencode: pin the version, verify at build time A pinned version avoids the rate-limited api.github.com lookup that broke the nodejs test. The binary stays owned by coder, so the coder user can run 'opencode upgrade'. A failed install now fails the build. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S9abShYK5RMmbeuZurGH3b --- fx/Dockerfile | 6 ++++-- golang/Dockerfile | 8 +++++--- nodejs/Dockerfile | 8 +++++--- php/Dockerfile | 8 +++++--- python/Dockerfile | 8 +++++--- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/fx/Dockerfile b/fx/Dockerfile index 7436dc8..ca1880f 100644 --- a/fx/Dockerfile +++ b/fx/Dockerfile @@ -5,6 +5,7 @@ ENV BUN_INSTALL=/usr/local ENV NODE_VERSION=24 ENV GO_VERSION=1.26.5 ENV GLAB_VERSION=1.111.0 +ENV OPENCODE_VERSION=1.18.13 ENV GOROOT=/usr/local/go ENV GOPATH=/home/coder/go ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH @@ -86,9 +87,10 @@ RUN \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /usr/local/bin/claude; fi && \ chmod 0755 /usr/local/bin/claude && \ # OPENCODE ################################################################## - (curl -fsSL https://opencode.ai/install | bash || true) && \ - if [ -f /root/.opencode/bin/opencode ]; then cp /root/.opencode/bin/opencode /usr/local/bin/opencode; fi && \ + curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ + cp /root/.opencode/bin/opencode /usr/local/bin/opencode && \ chmod 0755 /usr/local/bin/opencode && \ + opencode --version && \ # NPM: CODEX, COPILOT ####################################################### npm install -g @openai/codex @github/copilot && \ # PI ######################################################################## diff --git a/golang/Dockerfile b/golang/Dockerfile index 85c7d9c..2b23802 100644 --- a/golang/Dockerfile +++ b/golang/Dockerfile @@ -3,6 +3,7 @@ FROM codercom/enterprise-base:ubuntu ENV NODE_VERSION=24 ENV GO_VERSION=1.26.5 ENV GLAB_VERSION=1.111.0 +ENV OPENCODE_VERSION=1.18.13 ENV GOROOT=/usr/local/go ENV GOPATH=/home/coder/go ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH @@ -50,11 +51,12 @@ RUN \ chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \ ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \ # OPENCODE ################################################################## - (curl -fsSL https://opencode.ai/install | bash || true) && \ + curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ mkdir -p /home/coder/.opencode/bin && \ - if [ -f /root/.opencode/bin/opencode ]; then cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode; fi && \ - chmod +x /home/coder/.opencode/bin/opencode 2>/dev/null || true && \ + cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode && \ + chmod 0755 /home/coder/.opencode/bin/opencode && \ ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \ + opencode --version && \ # NPM: CODEX, COPILOT ####################################################### npm install -g @openai/codex @github/copilot && \ # PI ######################################################################## diff --git a/nodejs/Dockerfile b/nodejs/Dockerfile index 8324331..7c1f8d1 100644 --- a/nodejs/Dockerfile +++ b/nodejs/Dockerfile @@ -4,6 +4,7 @@ ENV DENO_INSTALL=/usr/local ENV BUN_INSTALL=/usr/local ENV NODE_VERSION=24 ENV GLAB_VERSION=1.111.0 +ENV OPENCODE_VERSION=1.18.13 USER root @@ -46,11 +47,12 @@ RUN \ chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \ ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \ # OPENCODE ################################################################## - (curl -fsSL https://opencode.ai/install | bash || true) && \ + curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ mkdir -p /home/coder/.opencode/bin && \ - if [ -f /root/.opencode/bin/opencode ]; then cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode; fi && \ - chmod +x /home/coder/.opencode/bin/opencode 2>/dev/null || true && \ + cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode && \ + chmod 0755 /home/coder/.opencode/bin/opencode && \ ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \ + opencode --version && \ # NPM: CODEX, COPILOT ####################################################### npm install -g @openai/codex @github/copilot && \ # PI ######################################################################## diff --git a/php/Dockerfile b/php/Dockerfile index a850703..7525c25 100644 --- a/php/Dockerfile +++ b/php/Dockerfile @@ -2,6 +2,7 @@ FROM codercom/enterprise-base:ubuntu ENV NODE_VERSION=24 ENV GLAB_VERSION=1.111.0 +ENV OPENCODE_VERSION=1.18.13 USER root @@ -53,11 +54,12 @@ RUN \ chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \ ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \ # OPENCODE ################################################################## - (curl -fsSL https://opencode.ai/install | bash || true) && \ + curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ mkdir -p /home/coder/.opencode/bin && \ - if [ -f /root/.opencode/bin/opencode ]; then cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode; fi && \ - chmod +x /home/coder/.opencode/bin/opencode 2>/dev/null || true && \ + cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode && \ + chmod 0755 /home/coder/.opencode/bin/opencode && \ ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \ + opencode --version && \ # NPM: CODEX, COPILOT ####################################################### npm install -g @openai/codex @github/copilot && \ # PI ######################################################################## diff --git a/python/Dockerfile b/python/Dockerfile index 2a83f00..72f35be 100644 --- a/python/Dockerfile +++ b/python/Dockerfile @@ -2,6 +2,7 @@ FROM codercom/enterprise-base:ubuntu ENV NODE_VERSION=24 ENV GLAB_VERSION=1.111.0 +ENV OPENCODE_VERSION=1.18.13 USER root @@ -42,11 +43,12 @@ RUN \ chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \ ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \ # OPENCODE ################################################################## - (curl -fsSL https://opencode.ai/install | bash || true) && \ + curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ mkdir -p /home/coder/.opencode/bin && \ - if [ -f /root/.opencode/bin/opencode ]; then cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode; fi && \ - chmod +x /home/coder/.opencode/bin/opencode 2>/dev/null || true && \ + cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode && \ + chmod 0755 /home/coder/.opencode/bin/opencode && \ ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \ + opencode --version && \ # NPM: CODEX, COPILOT ####################################################### npm install -g @openai/codex @github/copilot && \ # PI ######################################################################## From a2c2e453b3cedf44e65383038c4319485b2241b5 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 10 Aug 2026 17:13:03 +0000 Subject: [PATCH 3/5] Fix '|| true' that can hide build failures && and || bind equally, so a bare '|| true' rescued any earlier failure in the RUN chain and produced broken images that still built. Chowns are now plain commands; the claude chmod fallback is in parentheses. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S9abShYK5RMmbeuZurGH3b --- fx/Dockerfile | 4 ++-- golang/Dockerfile | 4 ++-- nodejs/Dockerfile | 4 ++-- php/Dockerfile | 4 ++-- python/Dockerfile | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fx/Dockerfile b/fx/Dockerfile index ca1880f..cb2f5c3 100644 --- a/fx/Dockerfile +++ b/fx/Dockerfile @@ -119,8 +119,8 @@ RUN \ echo 'export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"' >> /etc/profile && \ echo 'export DOCKER_HOST="unix://${XDG_RUNTIME_DIR}/docker.sock"' >> /etc/profile && \ # OWNERSHIP (coder can upgrade tools) ###################################### - chown coder:coder /usr/local/bin/claude /usr/local/bin/opencode 2>/dev/null || true && \ - chown -R coder:coder /home/coder/go 2>/dev/null || true && \ + chown coder:coder /usr/local/bin/claude /usr/local/bin/opencode && \ + chown -R coder:coder /home/coder/go && \ # CLEANUP ################################################################### apt-get clean -y && \ apt-get autoclean -y && \ diff --git a/golang/Dockerfile b/golang/Dockerfile index 2b23802..069e71a 100644 --- a/golang/Dockerfile +++ b/golang/Dockerfile @@ -48,7 +48,7 @@ RUN \ mkdir -p /home/coder/.local/bin && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \ - chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \ + (chmod +x /home/coder/.local/bin/claude 2>/dev/null || true) && \ ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \ # OPENCODE ################################################################## curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ @@ -71,7 +71,7 @@ RUN \ echo 'export GOPATH="$HOME/go"' >> /etc/profile && \ echo 'export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"' >> /etc/profile && \ # OWNERSHIP ################################################################ - chown -R coder:coder /home/coder/.local /home/coder/.opencode /home/coder/go 2>/dev/null || true && \ + chown -R coder:coder /home/coder/.local /home/coder/.opencode /home/coder/go && \ # CLEANUP ################################################################### apt-get clean -y && \ apt-get autoclean -y && \ diff --git a/nodejs/Dockerfile b/nodejs/Dockerfile index 7c1f8d1..ff85fd8 100644 --- a/nodejs/Dockerfile +++ b/nodejs/Dockerfile @@ -44,7 +44,7 @@ RUN \ mkdir -p /home/coder/.local/bin && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \ - chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \ + (chmod +x /home/coder/.local/bin/claude 2>/dev/null || true) && \ ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \ # OPENCODE ################################################################## curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ @@ -68,7 +68,7 @@ RUN \ echo '[ -d "$DENO_INSTALL/bin" ] && export PATH="$DENO_INSTALL/bin:$PATH"' >> /etc/profile && \ echo '[ -d "$BUN_INSTALL/bin" ] && export PATH="$BUN_INSTALL/bin:$PATH"' >> /etc/profile && \ # OWNERSHIP ################################################################ - chown -R coder:coder /home/coder/.local /home/coder/.opencode 2>/dev/null || true && \ + chown -R coder:coder /home/coder/.local /home/coder/.opencode && \ # CLEANUP ################################################################### apt-get clean -y && \ apt-get autoclean -y && \ diff --git a/php/Dockerfile b/php/Dockerfile index 7525c25..8e720b8 100644 --- a/php/Dockerfile +++ b/php/Dockerfile @@ -51,7 +51,7 @@ RUN \ mkdir -p /home/coder/.local/bin && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \ - chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \ + (chmod +x /home/coder/.local/bin/claude 2>/dev/null || true) && \ ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \ # OPENCODE ################################################################## curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ @@ -68,7 +68,7 @@ RUN \ npm install -g agent-browser && \ runuser -u coder -- agent-browser install && \ # OWNERSHIP ################################################################ - chown -R coder:coder /home/coder/.local /home/coder/.opencode 2>/dev/null || true && \ + chown -R coder:coder /home/coder/.local /home/coder/.opencode && \ # CLEANUP ################################################################### apt-get clean -y && \ apt-get autoclean -y && \ diff --git a/python/Dockerfile b/python/Dockerfile index 72f35be..489c88e 100644 --- a/python/Dockerfile +++ b/python/Dockerfile @@ -40,7 +40,7 @@ RUN \ mkdir -p /home/coder/.local/bin && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \ - chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \ + (chmod +x /home/coder/.local/bin/claude 2>/dev/null || true) && \ ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \ # OPENCODE ################################################################## curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \ @@ -57,7 +57,7 @@ RUN \ npm install -g agent-browser && \ runuser -u coder -- agent-browser install && \ # OWNERSHIP ################################################################ - chown -R coder:coder /home/coder/.local /home/coder/.opencode 2>/dev/null || true && \ + chown -R coder:coder /home/coder/.local /home/coder/.opencode && \ # CLEANUP ################################################################### apt-get clean -y && \ apt-get autoclean -y && \ From cc6c51f7b4418471578c523f5cf2bcf481b68b54 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 10 Aug 2026 17:13:03 +0000 Subject: [PATCH 4/5] Pin all tool versions with ENV variables Every installed tool now has an ENV *_VERSION pin: claude, deno, bun, composer, codex, copilot, pi, t3, pnpm, agent-browser. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S9abShYK5RMmbeuZurGH3b --- fx/Dockerfile | 28 +++++++++++++++++++--------- golang/Dockerfile | 13 +++++++++---- nodejs/Dockerfile | 19 +++++++++++++------ php/Dockerfile | 16 +++++++++++----- python/Dockerfile | 13 +++++++++---- 5 files changed, 61 insertions(+), 28 deletions(-) diff --git a/fx/Dockerfile b/fx/Dockerfile index cb2f5c3..98f825e 100644 --- a/fx/Dockerfile +++ b/fx/Dockerfile @@ -6,6 +6,16 @@ ENV NODE_VERSION=24 ENV GO_VERSION=1.26.5 ENV GLAB_VERSION=1.111.0 ENV OPENCODE_VERSION=1.18.13 +ENV CLAUDE_VERSION=2.1.224 +ENV DENO_VERSION=2.9.4 +ENV BUN_VERSION=1.3.14 +ENV COMPOSER_VERSION=2.10.2 +ENV CODEX_VERSION=0.147.0 +ENV COPILOT_VERSION=1.0.78 +ENV PI_VERSION=0.84.1 +ENV T3_VERSION=0.0.31 +ENV PNPM_VERSION=11.20.0 +ENV AGENT_BROWSER_VERSION=0.33.2 ENV GOROOT=/usr/local/go ENV GOPATH=/home/coder/go ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH @@ -70,19 +80,19 @@ RUN \ rm /tmp/go.tar.gz && \ mkdir -p /home/coder/go && \ # COMPOSER ################################################################## - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer --version=${COMPOSER_VERSION} && \ # GLAB (GitLab CLI) ######################################################## curl -fsSL "https://gitlab.com/gitlab-org/cli/-/releases/v${GLAB_VERSION}/downloads/glab_${GLAB_VERSION}_linux_$(dpkg --print-architecture).deb" -o /tmp/glab.deb && \ dpkg -i /tmp/glab.deb && \ rm -f /tmp/glab.deb && \ # DENO ###################################################################### - curl -fsSL https://deno.land/install.sh | sh && \ + curl -fsSL https://deno.land/install.sh | sh -s v${DENO_VERSION} && \ # BUN ####################################################################### - curl -fsSL https://bun.sh/install | bash && \ + curl -fsSL https://bun.sh/install | bash -s "bun-v${BUN_VERSION}" && \ # CLAUDE #################################################################### # Install into /usr/local/bin (image layer) so the binary survives the # persistent /home/coder volume that Coder mounts over the home dir at runtime. - (curl -fsSL https://claude.ai/install.sh | bash || true) && \ + (curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /usr/local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /usr/local/bin/claude; fi && \ chmod 0755 /usr/local/bin/claude && \ @@ -92,15 +102,15 @@ RUN \ chmod 0755 /usr/local/bin/opencode && \ opencode --version && \ # NPM: CODEX, COPILOT ####################################################### - npm install -g @openai/codex @github/copilot && \ + npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \ # PI ######################################################################## - npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \ + npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \ # T3CODE (browser GUI for coding agents) ################################### - npm install -g t3 && \ + npm install -g t3@${T3_VERSION} && \ # PNPM ###################################################################### - npm install -g pnpm && \ + npm install -g pnpm@${PNPM_VERSION} && \ # AGENT-BROWSER ############################################################## - npm install -g agent-browser && \ + npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \ runuser -u coder -- agent-browser install && \ # PROFILE (DENO, BUN PATH) ################################################## echo '' >> /etc/profile && \ diff --git a/golang/Dockerfile b/golang/Dockerfile index 069e71a..0c492dd 100644 --- a/golang/Dockerfile +++ b/golang/Dockerfile @@ -4,6 +4,11 @@ ENV NODE_VERSION=24 ENV GO_VERSION=1.26.5 ENV GLAB_VERSION=1.111.0 ENV OPENCODE_VERSION=1.18.13 +ENV CLAUDE_VERSION=2.1.224 +ENV CODEX_VERSION=0.147.0 +ENV COPILOT_VERSION=1.0.78 +ENV PI_VERSION=0.84.1 +ENV AGENT_BROWSER_VERSION=0.33.2 ENV GOROOT=/usr/local/go ENV GOPATH=/home/coder/go ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH @@ -44,7 +49,7 @@ RUN \ rm /tmp/go.tar.gz && \ mkdir -p /home/coder/go && \ # CLAUDE #################################################################### - (curl -fsSL https://claude.ai/install.sh | bash || true) && \ + (curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \ mkdir -p /home/coder/.local/bin && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \ @@ -58,11 +63,11 @@ RUN \ ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \ opencode --version && \ # NPM: CODEX, COPILOT ####################################################### - npm install -g @openai/codex @github/copilot && \ + npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \ # PI ######################################################################## - npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \ + npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \ # AGENT-BROWSER ############################################################## - npm install -g agent-browser && \ + npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \ runuser -u coder -- agent-browser install && \ # PROFILE ################################################################## echo '' >> /etc/profile && \ diff --git a/nodejs/Dockerfile b/nodejs/Dockerfile index ff85fd8..0322e2c 100644 --- a/nodejs/Dockerfile +++ b/nodejs/Dockerfile @@ -5,6 +5,13 @@ ENV BUN_INSTALL=/usr/local ENV NODE_VERSION=24 ENV GLAB_VERSION=1.111.0 ENV OPENCODE_VERSION=1.18.13 +ENV CLAUDE_VERSION=2.1.224 +ENV DENO_VERSION=2.9.4 +ENV BUN_VERSION=1.3.14 +ENV CODEX_VERSION=0.147.0 +ENV COPILOT_VERSION=1.0.78 +ENV PI_VERSION=0.84.1 +ENV AGENT_BROWSER_VERSION=0.33.2 USER root @@ -36,11 +43,11 @@ RUN \ dpkg -i /tmp/glab.deb && \ rm -f /tmp/glab.deb && \ # DENO ###################################################################### - curl -fsSL https://deno.land/install.sh | sh && \ + curl -fsSL https://deno.land/install.sh | sh -s v${DENO_VERSION} && \ # BUN ####################################################################### - curl -fsSL https://bun.sh/install | bash && \ + curl -fsSL https://bun.sh/install | bash -s "bun-v${BUN_VERSION}" && \ # CLAUDE #################################################################### - (curl -fsSL https://claude.ai/install.sh | bash || true) && \ + (curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \ mkdir -p /home/coder/.local/bin && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \ @@ -54,11 +61,11 @@ RUN \ ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \ opencode --version && \ # NPM: CODEX, COPILOT ####################################################### - npm install -g @openai/codex @github/copilot && \ + npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \ # PI ######################################################################## - npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \ + npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \ # AGENT-BROWSER ############################################################## - npm install -g agent-browser && \ + npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \ runuser -u coder -- agent-browser install && \ # PROFILE ################################################################## echo '' >> /etc/profile && \ diff --git a/php/Dockerfile b/php/Dockerfile index 8e720b8..2bda237 100644 --- a/php/Dockerfile +++ b/php/Dockerfile @@ -3,6 +3,12 @@ FROM codercom/enterprise-base:ubuntu ENV NODE_VERSION=24 ENV GLAB_VERSION=1.111.0 ENV OPENCODE_VERSION=1.18.13 +ENV CLAUDE_VERSION=2.1.224 +ENV COMPOSER_VERSION=2.10.2 +ENV CODEX_VERSION=0.147.0 +ENV COPILOT_VERSION=1.0.78 +ENV PI_VERSION=0.84.1 +ENV AGENT_BROWSER_VERSION=0.33.2 USER root @@ -41,13 +47,13 @@ RUN \ libatk1.0-0 libxrender1 libfontconfig1 libdbus-1-3 libxcb1 libxext6 libx11-6 && \ echo 'variables_order = "EGPCS"' > /etc/php/8.5/cli/conf.d/99-coder.ini && \ # COMPOSER ################################################################## - curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \ + curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer --version=${COMPOSER_VERSION} && \ # GLAB (GitLab CLI) ######################################################## curl -fsSL "https://gitlab.com/gitlab-org/cli/-/releases/v${GLAB_VERSION}/downloads/glab_${GLAB_VERSION}_linux_$(dpkg --print-architecture).deb" -o /tmp/glab.deb && \ dpkg -i /tmp/glab.deb && \ rm -f /tmp/glab.deb && \ # CLAUDE #################################################################### - (curl -fsSL https://claude.ai/install.sh | bash || true) && \ + (curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \ mkdir -p /home/coder/.local/bin && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \ @@ -61,11 +67,11 @@ RUN \ ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \ opencode --version && \ # NPM: CODEX, COPILOT ####################################################### - npm install -g @openai/codex @github/copilot && \ + npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \ # PI ######################################################################## - npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \ + npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \ # AGENT-BROWSER ############################################################## - npm install -g agent-browser && \ + npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \ runuser -u coder -- agent-browser install && \ # OWNERSHIP ################################################################ chown -R coder:coder /home/coder/.local /home/coder/.opencode && \ diff --git a/python/Dockerfile b/python/Dockerfile index 489c88e..f34ae51 100644 --- a/python/Dockerfile +++ b/python/Dockerfile @@ -3,6 +3,11 @@ FROM codercom/enterprise-base:ubuntu ENV NODE_VERSION=24 ENV GLAB_VERSION=1.111.0 ENV OPENCODE_VERSION=1.18.13 +ENV CLAUDE_VERSION=2.1.224 +ENV CODEX_VERSION=0.147.0 +ENV COPILOT_VERSION=1.0.78 +ENV PI_VERSION=0.84.1 +ENV AGENT_BROWSER_VERSION=0.33.2 USER root @@ -36,7 +41,7 @@ RUN \ dpkg -i /tmp/glab.deb && \ rm -f /tmp/glab.deb && \ # CLAUDE #################################################################### - (curl -fsSL https://claude.ai/install.sh | bash || true) && \ + (curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \ mkdir -p /home/coder/.local/bin && \ if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \ if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \ @@ -50,11 +55,11 @@ RUN \ ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \ opencode --version && \ # NPM: CODEX, COPILOT ####################################################### - npm install -g @openai/codex @github/copilot && \ + npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \ # PI ######################################################################## - npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \ + npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \ # AGENT-BROWSER ############################################################## - npm install -g agent-browser && \ + npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \ runuser -u coder -- agent-browser install && \ # OWNERSHIP ################################################################ chown -R coder:coder /home/coder/.local /home/coder/.opencode && \ From 28b55864f144f9e89c8f7504c0ef4418d43813b0 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 10 Aug 2026 17:13:03 +0000 Subject: [PATCH 5/5] Add AGENTS.md with repo conventions Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S9abShYK5RMmbeuZurGH3b --- AGENTS.md | 19 +++++++++++++++++++ CLAUDE.md | 3 +++ 2 files changed, 22 insertions(+) create mode 100644 AGENTS.md create mode 100644 CLAUDE.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..4b6e09b --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,19 @@ +# AGENTS.md + +Coder Docker images (fx, php, nodejs, golang, python). + +## Writing style + +- Write in ASD-STE100 (Simplified Technical English). +- Follow Zinsser's four principles of quality writing: + 1. Simplicity + 2. Brevity + 3. Clarity + 4. Humanity + +## Conventions + +- Pin every tool version with an `ENV *_VERSION` variable in each Dockerfile. +- Keep Dockerfile comments very short and simple. +- No unparenthesized `|| true` in RUN chains — it can silently skip the rest of the build. +- Smoke tests live in the Makefile (`make test DOCKER_VARIANT=`). diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..a263c70 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,3 @@ +# CLAUDE.md + +See [AGENTS.md](AGENTS.md).