Repository navigation
Expand file tree
/
Copy pathDockerfile
More file actions
144 lines (136 loc) · 7.6 KB
/
Copy pathDockerfile
File metadata and controls
144 lines (136 loc) · 7.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
FROM codercom/enterprise-base:ubuntu
ENV DENO_INSTALL=/usr/local
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 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
# Rootless Docker (docker-in-docker without privileged root)
ENV XDG_RUNTIME_DIR=/run/user/1000
ENV DOCKER_HOST=unix:///run/user/1000/docker.sock
# T3 Code: opt out of telemetry by default
ENV T3CODE_TELEMETRY_ENABLED=false
USER root
# Helper to bring up the rootless Docker daemon at workspace start
COPY --chmod=0755 dockerd-rootless-start.sh /usr/local/bin/dockerd-rootless-start
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 gpg && \
# Node repo
curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - && \
# 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 && \
install -D -m 644 /tmp/githubcli-archive-keyring.gpg /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" > /etc/apt/sources.list.d/github-cli.list && \
rm -f /tmp/githubcli-archive-keyring.gpg && \
# SINGLE UPDATE + INSTALL ##################################################
apt-get update && \
apt-get dist-upgrade -y && \
apt-get install -y --no-install-recommends \
git jq ripgrep tmux \
# Node
nodejs \
# PHP
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 \
php8.5-xdebug php8.5-pcov \
php8.5-igbinary php8.5-gmp php8.5-ldap \
php8.5-amqp php8.5-memcache php8.5-memcached php8.5-xsl php8.5-yaml \
# Python
python3 python3-pip python3-venv \
# Rootless Docker (docker-ce is already in the base image)
docker-ce-rootless-extras uidmap dbus-user-session fuse-overlayfs slirp4netns \
# GitHub CLI
gh \
# Chrome libs (agent-browser)
libnspr4 libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libatspi2.0-0 \
libcups2t64 libxshmfence1 libgbm1 libpango-1.0-0 libpangocairo-1.0-0 \
libasound2t64 libx11-xcb1 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
libxi6 libgtk-3-0t64 libcairo2 libcairo-gobject2 libgdk-pixbuf-2.0-0 \
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 && \
# GOLANG ####################################################################
ARCH=$(dpkg --print-architecture) && \
curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz" -o /tmp/go.tar.gz && \
tar -C /usr/local -xzf /tmp/go.tar.gz && \
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 --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 -s v${DENO_VERSION} && \
# BUN #######################################################################
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 -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 && \
# OPENCODE ##################################################################
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@${CODEX_VERSION} @github/copilot@${COPILOT_VERSION} && \
# PI ########################################################################
npm install -g --ignore-scripts @earendil-works/pi-coding-agent@${PI_VERSION} && \
# T3CODE (browser GUI for coding agents) ###################################
npm install -g t3@${T3_VERSION} && \
# PNPM ######################################################################
npm install -g pnpm@${PNPM_VERSION} && \
# AGENT-BROWSER ##############################################################
npm install -g agent-browser@${AGENT_BROWSER_VERSION} && \
runuser -u coder -- agent-browser install && \
# PROFILE (DENO, BUN PATH) ##################################################
echo '' >> /etc/profile && \
echo '# Go' >> /etc/profile && \
echo 'export GOROOT=/usr/local/go' >> /etc/profile && \
echo 'export GOPATH="$HOME/go"' >> /etc/profile && \
echo 'export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"' >> /etc/profile && \
echo '' >> /etc/profile && \
echo '# Deno, Bun' >> /etc/profile && \
echo 'export DENO_INSTALL="${DENO_INSTALL:-/usr/local}"' >> /etc/profile && \
echo 'export BUN_INSTALL="${BUN_INSTALL:-/usr/local}"' >> /etc/profile && \
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 && \
echo '' >> /etc/profile && \
echo '# Rootless Docker' >> /etc/profile && \
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 && \
chown -R coder:coder /home/coder/go && \
# CLEANUP ###################################################################
apt-get clean -y && \
apt-get autoclean -y && \
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
WORKDIR /home/coder
USER coder