Skip to content

Commit e01fd54

Browse files
committed
Pin all tool versions via ENV, simplify comments
Every installed tool now has an ENV *_VERSION pin: claude, deno, bun, composer, codex, copilot, pi, t3, pnpm, agent-browser (opencode, glab, go, node were already pinned). Conventions noted in CLAUDE.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S9abShYK5RMmbeuZurGH3b
1 parent 9dd85fa commit e01fd54

6 files changed

Lines changed: 73 additions & 41 deletions

File tree

‎CLAUDE.md‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# CLAUDE.md
2+
3+
Coder Docker images (fx, php, nodejs, golang, python).
4+
5+
## Conventions
6+
7+
- Pin every tool version with an `ENV *_VERSION` variable in each Dockerfile.
8+
- Keep Dockerfile comments very short and simple.
9+
- No unparenthesized `|| true` in RUN chains — it can silently skip the rest of the build.
10+
- Smoke tests live in the Makefile (`make test DOCKER_VARIANT=<variant>`).

‎fx/Dockerfile‎

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,16 @@ ENV NODE_VERSION=24
66
ENV GO_VERSION=1.26.5
77
ENV GLAB_VERSION=1.111.0
88
ENV OPENCODE_VERSION=1.18.13
9+
ENV CLAUDE_VERSION=2.1.224
10+
ENV DENO_VERSION=2.9.4
11+
ENV BUN_VERSION=1.3.14
12+
ENV COMPOSER_VERSION=2.10.2
13+
ENV CODEX_VERSION=0.147.0
14+
ENV COPILOT_VERSION=1.0.78
15+
ENV PI_VERSION=0.84.1
16+
ENV T3_VERSION=0.0.31
17+
ENV PNPM_VERSION=11.20.0
18+
ENV AGENT_BROWSER_VERSION=0.33.2
919
ENV GOROOT=/usr/local/go
1020
ENV GOPATH=/home/coder/go
1121
ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH
@@ -42,8 +52,7 @@ RUN \
4252
git jq ripgrep tmux \
4353
# Node
4454
nodejs \
45-
# PHP (native Ubuntu packages; ondrej PPA has no release for this Ubuntu
46-
# version and php8.5-imap no longer exists — imap was unbundled in 8.4)
55+
# PHP
4756
php8.5-cli php8.5-common php8.5-curl php8.5-gd php8.5-intl \
4857
php8.5-mailparse php8.5-mbstring php8.5-mysql php8.5-pgsql php8.5-phpdbg \
4958
php8.5-readline php8.5-redis php8.5-soap php8.5-sqlite3 php8.5-xml \
@@ -71,38 +80,37 @@ RUN \
7180
rm /tmp/go.tar.gz && \
7281
mkdir -p /home/coder/go && \
7382
# COMPOSER ##################################################################
74-
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
83+
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer --version=${COMPOSER_VERSION} && \
7584
# GLAB (GitLab CLI) ########################################################
7685
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 && \
7786
dpkg -i /tmp/glab.deb && \
7887
rm -f /tmp/glab.deb && \
7988
# DENO ######################################################################
80-
curl -fsSL https://deno.land/install.sh | sh && \
89+
curl -fsSL https://deno.land/install.sh | sh -s v${DENO_VERSION} && \
8190
# BUN #######################################################################
82-
curl -fsSL https://bun.sh/install | bash && \
91+
curl -fsSL https://bun.sh/install | bash -s "bun-v${BUN_VERSION}" && \
8392
# CLAUDE ####################################################################
8493
# Install into /usr/local/bin (image layer) so the binary survives the
8594
# persistent /home/coder volume that Coder mounts over the home dir at runtime.
86-
(curl -fsSL https://claude.ai/install.sh | bash || true) && \
95+
(curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \
8796
if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /usr/local/bin/claude; fi && \
8897
if [ -f /root/bin/claude ]; then cp /root/bin/claude /usr/local/bin/claude; fi && \
8998
chmod 0755 /usr/local/bin/claude && \
9099
# OPENCODE ##################################################################
91-
# Pinned version: avoids the rate-limited api.github.com "latest" lookup.
92100
curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \
93101
cp /root/.opencode/bin/opencode /usr/local/bin/opencode && \
94102
chmod 0755 /usr/local/bin/opencode && \
95103
opencode --version && \
96104
# NPM: CODEX, COPILOT #######################################################
97-
npm install -g @openai/codex @github/copilot && \
105+
npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \
98106
# PI ########################################################################
99-
npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \
107+
npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \
100108
# T3CODE (browser GUI for coding agents) ###################################
101-
npm install -g t3 && \
109+
npm install -g t3@${T3_VERSION} && \
102110
# PNPM ######################################################################
103-
npm install -g pnpm && \
111+
npm install -g pnpm@${PNPM_VERSION} && \
104112
# AGENT-BROWSER ##############################################################
105-
npm install -g agent-browser && \
113+
npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \
106114
runuser -u coder -- agent-browser install && \
107115
# PROFILE (DENO, BUN PATH) ##################################################
108116
echo '' >> /etc/profile && \

‎golang/Dockerfile‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ ENV NODE_VERSION=24
44
ENV GO_VERSION=1.26.5
55
ENV GLAB_VERSION=1.111.0
66
ENV OPENCODE_VERSION=1.18.13
7+
ENV CLAUDE_VERSION=2.1.224
8+
ENV CODEX_VERSION=0.147.0
9+
ENV COPILOT_VERSION=1.0.78
10+
ENV PI_VERSION=0.84.1
11+
ENV AGENT_BROWSER_VERSION=0.33.2
712
ENV GOROOT=/usr/local/go
813
ENV GOPATH=/home/coder/go
914
ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH
@@ -44,27 +49,25 @@ RUN \
4449
rm /tmp/go.tar.gz && \
4550
mkdir -p /home/coder/go && \
4651
# CLAUDE ####################################################################
47-
(curl -fsSL https://claude.ai/install.sh | bash || true) && \
52+
(curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \
4853
mkdir -p /home/coder/.local/bin && \
4954
if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \
5055
if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \
5156
(chmod +x /home/coder/.local/bin/claude 2>/dev/null || true) && \
5257
ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \
5358
# OPENCODE ##################################################################
54-
# Pinned version: avoids the rate-limited api.github.com "latest" lookup.
55-
# Installed into /home/coder/.opencode/bin so the coder user can self-upgrade.
5659
curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \
5760
mkdir -p /home/coder/.opencode/bin && \
5861
cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode && \
5962
chmod 0755 /home/coder/.opencode/bin/opencode && \
6063
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
6164
opencode --version && \
6265
# NPM: CODEX, COPILOT #######################################################
63-
npm install -g @openai/codex @github/copilot && \
66+
npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \
6467
# PI ########################################################################
65-
npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \
68+
npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \
6669
# AGENT-BROWSER ##############################################################
67-
npm install -g agent-browser && \
70+
npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \
6871
runuser -u coder -- agent-browser install && \
6972
# PROFILE ##################################################################
7073
echo '' >> /etc/profile && \

‎nodejs/Dockerfile‎

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ ENV BUN_INSTALL=/usr/local
55
ENV NODE_VERSION=24
66
ENV GLAB_VERSION=1.111.0
77
ENV OPENCODE_VERSION=1.18.13
8+
ENV CLAUDE_VERSION=2.1.224
9+
ENV DENO_VERSION=2.9.4
10+
ENV BUN_VERSION=1.3.14
11+
ENV CODEX_VERSION=0.147.0
12+
ENV COPILOT_VERSION=1.0.78
13+
ENV PI_VERSION=0.84.1
14+
ENV AGENT_BROWSER_VERSION=0.33.2
815

916
USER root
1017

@@ -36,31 +43,29 @@ RUN \
3643
dpkg -i /tmp/glab.deb && \
3744
rm -f /tmp/glab.deb && \
3845
# DENO ######################################################################
39-
curl -fsSL https://deno.land/install.sh | sh && \
46+
curl -fsSL https://deno.land/install.sh | sh -s v${DENO_VERSION} && \
4047
# BUN #######################################################################
41-
curl -fsSL https://bun.sh/install | bash && \
48+
curl -fsSL https://bun.sh/install | bash -s "bun-v${BUN_VERSION}" && \
4249
# CLAUDE ####################################################################
43-
(curl -fsSL https://claude.ai/install.sh | bash || true) && \
50+
(curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \
4451
mkdir -p /home/coder/.local/bin && \
4552
if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \
4653
if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \
4754
(chmod +x /home/coder/.local/bin/claude 2>/dev/null || true) && \
4855
ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \
4956
# OPENCODE ##################################################################
50-
# Pinned version: avoids the rate-limited api.github.com "latest" lookup.
51-
# Installed into /home/coder/.opencode/bin so the coder user can self-upgrade.
5257
curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \
5358
mkdir -p /home/coder/.opencode/bin && \
5459
cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode && \
5560
chmod 0755 /home/coder/.opencode/bin/opencode && \
5661
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
5762
opencode --version && \
5863
# NPM: CODEX, COPILOT #######################################################
59-
npm install -g @openai/codex @github/copilot && \
64+
npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \
6065
# PI ########################################################################
61-
npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \
66+
npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \
6267
# AGENT-BROWSER ##############################################################
63-
npm install -g agent-browser && \
68+
npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \
6469
runuser -u coder -- agent-browser install && \
6570
# PROFILE ##################################################################
6671
echo '' >> /etc/profile && \

‎php/Dockerfile‎

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ FROM codercom/enterprise-base:ubuntu
33
ENV NODE_VERSION=24
44
ENV GLAB_VERSION=1.111.0
55
ENV OPENCODE_VERSION=1.18.13
6+
ENV CLAUDE_VERSION=2.1.224
7+
ENV COMPOSER_VERSION=2.10.2
8+
ENV CODEX_VERSION=0.147.0
9+
ENV COPILOT_VERSION=1.0.78
10+
ENV PI_VERSION=0.84.1
11+
ENV AGENT_BROWSER_VERSION=0.33.2
612

713
USER root
814

@@ -23,8 +29,7 @@ RUN \
2329
apt-get dist-upgrade -y && \
2430
apt-get install -y --no-install-recommends \
2531
git jq ripgrep tmux nodejs \
26-
# PHP (native Ubuntu packages; ondrej PPA has no release for this Ubuntu
27-
# version and php8.5-imap no longer exists — imap was unbundled in 8.4)
32+
# PHP
2833
php8.5-cli php8.5-common php8.5-curl php8.5-gd php8.5-intl \
2934
php8.5-mailparse php8.5-mbstring php8.5-mysql php8.5-pgsql php8.5-phpdbg \
3035
php8.5-readline php8.5-redis php8.5-soap php8.5-sqlite3 php8.5-xml \
@@ -42,33 +47,31 @@ RUN \
4247
libatk1.0-0 libxrender1 libfontconfig1 libdbus-1-3 libxcb1 libxext6 libx11-6 && \
4348
echo 'variables_order = "EGPCS"' > /etc/php/8.5/cli/conf.d/99-coder.ini && \
4449
# COMPOSER ##################################################################
45-
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
50+
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer --version=${COMPOSER_VERSION} && \
4651
# GLAB (GitLab CLI) ########################################################
4752
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 && \
4853
dpkg -i /tmp/glab.deb && \
4954
rm -f /tmp/glab.deb && \
5055
# CLAUDE ####################################################################
51-
(curl -fsSL https://claude.ai/install.sh | bash || true) && \
56+
(curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \
5257
mkdir -p /home/coder/.local/bin && \
5358
if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \
5459
if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \
5560
(chmod +x /home/coder/.local/bin/claude 2>/dev/null || true) && \
5661
ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \
5762
# OPENCODE ##################################################################
58-
# Pinned version: avoids the rate-limited api.github.com "latest" lookup.
59-
# Installed into /home/coder/.opencode/bin so the coder user can self-upgrade.
6063
curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \
6164
mkdir -p /home/coder/.opencode/bin && \
6265
cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode && \
6366
chmod 0755 /home/coder/.opencode/bin/opencode && \
6467
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
6568
opencode --version && \
6669
# NPM: CODEX, COPILOT #######################################################
67-
npm install -g @openai/codex @github/copilot && \
70+
npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \
6871
# PI ########################################################################
69-
npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \
72+
npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \
7073
# AGENT-BROWSER ##############################################################
71-
npm install -g agent-browser && \
74+
npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \
7275
runuser -u coder -- agent-browser install && \
7376
# OWNERSHIP ################################################################
7477
chown -R coder:coder /home/coder/.local /home/coder/.opencode && \

‎python/Dockerfile‎

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ FROM codercom/enterprise-base:ubuntu
33
ENV NODE_VERSION=24
44
ENV GLAB_VERSION=1.111.0
55
ENV OPENCODE_VERSION=1.18.13
6+
ENV CLAUDE_VERSION=2.1.224
7+
ENV CODEX_VERSION=0.147.0
8+
ENV COPILOT_VERSION=1.0.78
9+
ENV PI_VERSION=0.84.1
10+
ENV AGENT_BROWSER_VERSION=0.33.2
611

712
USER root
813

@@ -36,27 +41,25 @@ RUN \
3641
dpkg -i /tmp/glab.deb && \
3742
rm -f /tmp/glab.deb && \
3843
# CLAUDE ####################################################################
39-
(curl -fsSL https://claude.ai/install.sh | bash || true) && \
44+
(curl -fsSL https://claude.ai/install.sh | bash -s ${CLAUDE_VERSION} || true) && \
4045
mkdir -p /home/coder/.local/bin && \
4146
if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \
4247
if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \
4348
(chmod +x /home/coder/.local/bin/claude 2>/dev/null || true) && \
4449
ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \
4550
# OPENCODE ##################################################################
46-
# Pinned version: avoids the rate-limited api.github.com "latest" lookup.
47-
# Installed into /home/coder/.opencode/bin so the coder user can self-upgrade.
4851
curl -fsSL https://opencode.ai/install | VERSION=${OPENCODE_VERSION} bash -s -- --no-modify-path && \
4952
mkdir -p /home/coder/.opencode/bin && \
5053
cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode && \
5154
chmod 0755 /home/coder/.opencode/bin/opencode && \
5255
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
5356
opencode --version && \
5457
# NPM: CODEX, COPILOT #######################################################
55-
npm install -g @openai/codex @github/copilot && \
58+
npm install -g @openai/codex@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \
5659
# PI ########################################################################
57-
npm install -g --ignore-scripts @earendil-works/pi-coding-agent && \
60+
npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \
5861
# AGENT-BROWSER ##############################################################
59-
npm install -g agent-browser && \
62+
npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \
6063
runuser -u coder -- agent-browser install && \
6164
# OWNERSHIP ################################################################
6265
chown -R coder:coder /home/coder/.local /home/coder/.opencode && \

0 commit comments

Comments
 (0)