Skip to content

Commit 461ac2d

Browse files
committed
Add per-language Docker images: php, nodejs, golang, python
Each image includes the language-specific toolchain plus shared AI tools (claude, opencode, codex, copilot, gh, agent-browser). - php: PHP 8.5 + Composer - nodejs: Node.js 22 + npm + Deno + Bun - golang: Go 1.24.2 - python: Python 3 + pip + venv - fx: everything combined (unchanged) Updated Makefile with per-image build/test targets and CI workflow with matrix strategy for parallel builds.
1 parent 79a83c4 commit 461ac2d

6 files changed

Lines changed: 356 additions & 17 deletions

File tree

.github/workflows/docker.yml

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,12 @@ permissions:
1313

1414
jobs:
1515
test:
16-
name: "Test"
16+
name: "Test (${{ matrix.image }})"
1717
runs-on: ubuntu-latest
18+
strategy:
19+
fail-fast: false
20+
matrix:
21+
image: [fx, php, nodejs, golang, python]
1822
steps:
1923
- name: Checkout
2024
uses: actions/checkout@v6
@@ -25,20 +29,24 @@ jobs:
2529
- name: Build image for testing
2630
uses: docker/build-push-action@v7
2731
with:
28-
context: ./fx
29-
file: ./fx/Dockerfile
32+
context: ./${{ matrix.image }}
33+
file: ./${{ matrix.image }}/Dockerfile
3034
push: false
31-
tags: dockette/coder:fx-test
35+
tags: dockette/coder:${{ matrix.image }}-test
3236
platforms: linux/amd64
3337
load: true
3438

3539
- name: Smoke test image
36-
run: make test DOCKER_TAG=fx-test
40+
run: make test DOCKER_VARIANT=${{ matrix.image }} DOCKER_TAG=${{ matrix.image }}-test
3741

3842
build:
39-
name: "Build"
43+
name: "Build (${{ matrix.image }})"
4044
needs: test
4145
runs-on: ubuntu-latest
46+
strategy:
47+
fail-fast: false
48+
matrix:
49+
image: [fx, php, nodejs, golang, python]
4250
steps:
4351
- name: Checkout
4452
uses: actions/checkout@v6
@@ -58,10 +66,10 @@ jobs:
5866
- name: Build and push
5967
uses: docker/build-push-action@v7
6068
with:
61-
context: ./fx
62-
file: ./fx/Dockerfile
69+
context: ./${{ matrix.image }}
70+
file: ./${{ matrix.image }}/Dockerfile
6371
push: ${{ github.ref == 'refs/heads/master' }}
64-
tags: dockette/coder:fx
72+
tags: dockette/coder:${{ matrix.image }}
6573
platforms: linux/amd64
6674
cache-from: type=gha
6775
cache-to: type=gha

Makefile

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,71 @@
11
DOCKER_IMAGE=dockette/coder
2-
DOCKER_TAG?=fx
2+
DOCKER_VARIANT?=fx
3+
DOCKER_TAG?=$(DOCKER_VARIANT)
34
DOCKER_PLATFORMS?=linux/amd64
45

6+
# Shared tools present in all images
7+
TOOLS_COMMON=agent-browser gh claude opencode codex copilot
8+
59
.PHONY: build
610
build:
7-
docker buildx build --platform ${DOCKER_PLATFORMS} -t ${DOCKER_IMAGE}:${DOCKER_TAG} fx/
11+
docker buildx build --platform ${DOCKER_PLATFORMS} -t ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_VARIANT}/
12+
13+
.PHONY: build-all
14+
build-all:
15+
$(MAKE) build DOCKER_VARIANT=fx
16+
$(MAKE) build DOCKER_VARIANT=php
17+
$(MAKE) build DOCKER_VARIANT=nodejs
18+
$(MAKE) build DOCKER_VARIANT=golang
19+
$(MAKE) build DOCKER_VARIANT=python
820

921
.PHONY: test
1022
test:
23+
$(MAKE) test-${DOCKER_VARIANT}
24+
25+
.PHONY: test-all
26+
test-all:
27+
$(MAKE) test-fx
28+
$(MAKE) test-php
29+
$(MAKE) test-nodejs
30+
$(MAKE) test-golang
31+
$(MAKE) test-python
32+
33+
.PHONY: test-fx
34+
test-fx:
1135
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} node --version
1236
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} npm --version
1337
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} node -e "console.log(process.arch)"
38+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} go version
39+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} python3 --version
40+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} pip3 --version
1441
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} php --version
1542
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} composer --version
1643
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} deno --version
1744
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} bun --version
18-
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} agent-browser --version
19-
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} gh --version
20-
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} claude --version
21-
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} opencode --version
22-
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} codex --version
23-
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} copilot --version
45+
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)
46+
47+
.PHONY: test-php
48+
test-php:
49+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} php --version
50+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} composer --version
51+
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)
52+
53+
.PHONY: test-nodejs
54+
test-nodejs:
55+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} node --version
56+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} npm --version
57+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} node -e "console.log(process.arch)"
58+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} deno --version
59+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} bun --version
60+
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)
61+
62+
.PHONY: test-golang
63+
test-golang:
64+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} go version
65+
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)
66+
67+
.PHONY: test-python
68+
test-python:
69+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} python3 --version
70+
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} pip3 --version
71+
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)

golang/Dockerfile

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
FROM codercom/enterprise-base:ubuntu
2+
3+
ENV NODE_VERSION=22
4+
ENV GO_VERSION=1.24.2
5+
ENV GOROOT=/usr/local/go
6+
ENV GOPATH=/home/coder/go
7+
ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH
8+
9+
USER root
10+
11+
RUN \
12+
# REPOS ####################################################################
13+
apt-get update && \
14+
apt-get install -y --no-install-recommends curl wget gpg && \
15+
# Node repo (needed for npm tools)
16+
curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - && \
17+
# GitHub CLI repo
18+
wget -qO /tmp/githubcli-archive-keyring.gpg https://cli.github.com/packages/githubcli-archive-keyring.gpg && \
19+
mkdir -p -m 755 /etc/apt/keyrings && \
20+
install -D -m 644 /tmp/githubcli-archive-keyring.gpg /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
21+
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 && \
22+
rm -f /tmp/githubcli-archive-keyring.gpg && \
23+
# SINGLE UPDATE + INSTALL ##################################################
24+
apt-get update && \
25+
apt-get dist-upgrade -y && \
26+
apt-get install -y --no-install-recommends \
27+
git jq ripgrep nodejs gh \
28+
# Chrome libs (agent-browser)
29+
libnspr4 libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libatspi2.0-0 \
30+
libcups2t64 libxshmfence1 libgbm1 libpango-1.0-0 libpangocairo-1.0-0 \
31+
libasound2t64 libx11-xcb1 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
32+
libxi6 libgtk-3-0t64 libcairo2 libcairo-gobject2 libgdk-pixbuf-2.0-0 \
33+
libatk1.0-0 libxrender1 libfontconfig1 libdbus-1-3 libxcb1 libxext6 libx11-6 && \
34+
# GOLANG ####################################################################
35+
ARCH=$(dpkg --print-architecture) && \
36+
curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz" -o /tmp/go.tar.gz && \
37+
tar -C /usr/local -xzf /tmp/go.tar.gz && \
38+
rm /tmp/go.tar.gz && \
39+
mkdir -p /home/coder/go && \
40+
# CLAUDE ####################################################################
41+
(curl -fsSL https://claude.ai/install.sh | bash || true) && \
42+
mkdir -p /home/coder/.local/bin && \
43+
if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \
44+
if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \
45+
chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \
46+
ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \
47+
# OPENCODE ##################################################################
48+
(curl -fsSL https://opencode.ai/install | bash || true) && \
49+
mkdir -p /home/coder/.opencode/bin && \
50+
if [ -f /root/.opencode/bin/opencode ]; then cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode; fi && \
51+
chmod +x /home/coder/.opencode/bin/opencode 2>/dev/null || true && \
52+
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
53+
# NPM: CODEX, COPILOT #######################################################
54+
npm install -g @openai/codex @github/copilot && \
55+
# AGENT-BROWSER ##############################################################
56+
npm install -g agent-browser && \
57+
runuser -u coder -- agent-browser install && \
58+
# PROFILE ##################################################################
59+
echo '' >> /etc/profile && \
60+
echo '# Go' >> /etc/profile && \
61+
echo 'export GOROOT=/usr/local/go' >> /etc/profile && \
62+
echo 'export GOPATH="$HOME/go"' >> /etc/profile && \
63+
echo 'export PATH="$GOROOT/bin:$GOPATH/bin:$PATH"' >> /etc/profile && \
64+
# OWNERSHIP ################################################################
65+
chown -R coder:coder /home/coder/.local /home/coder/.opencode /home/coder/go 2>/dev/null || true && \
66+
# CLEANUP ###################################################################
67+
apt-get clean -y && \
68+
apt-get autoclean -y && \
69+
apt-get remove -y wget && \
70+
apt-get autoremove -y && \
71+
rm -rf /var/lib/apt/lists/* /var/lib/log/* /tmp/* /var/tmp/* \
72+
/root/.npm /root/.cache /root/.local /root/.opencode
73+
74+
WORKDIR /home/coder
75+
76+
USER coder

nodejs/Dockerfile

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
FROM codercom/enterprise-base:ubuntu
2+
3+
ENV DENO_INSTALL=/usr/local
4+
ENV BUN_INSTALL=/usr/local
5+
ENV NODE_VERSION=22
6+
7+
USER root
8+
9+
RUN \
10+
# REPOS ####################################################################
11+
apt-get update && \
12+
apt-get install -y --no-install-recommends curl wget gpg && \
13+
# Node repo
14+
curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - && \
15+
# GitHub CLI repo
16+
wget -qO /tmp/githubcli-archive-keyring.gpg https://cli.github.com/packages/githubcli-archive-keyring.gpg && \
17+
mkdir -p -m 755 /etc/apt/keyrings && \
18+
install -D -m 644 /tmp/githubcli-archive-keyring.gpg /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
19+
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 && \
20+
rm -f /tmp/githubcli-archive-keyring.gpg && \
21+
# SINGLE UPDATE + INSTALL ##################################################
22+
apt-get update && \
23+
apt-get dist-upgrade -y && \
24+
apt-get install -y --no-install-recommends \
25+
git jq ripgrep nodejs gh \
26+
# Chrome libs (agent-browser)
27+
libnspr4 libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libatspi2.0-0 \
28+
libcups2t64 libxshmfence1 libgbm1 libpango-1.0-0 libpangocairo-1.0-0 \
29+
libasound2t64 libx11-xcb1 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
30+
libxi6 libgtk-3-0t64 libcairo2 libcairo-gobject2 libgdk-pixbuf-2.0-0 \
31+
libatk1.0-0 libxrender1 libfontconfig1 libdbus-1-3 libxcb1 libxext6 libx11-6 && \
32+
# DENO ######################################################################
33+
curl -fsSL https://deno.land/install.sh | sh && \
34+
# BUN #######################################################################
35+
curl -fsSL https://bun.sh/install | bash && \
36+
# CLAUDE ####################################################################
37+
(curl -fsSL https://claude.ai/install.sh | bash || true) && \
38+
mkdir -p /home/coder/.local/bin && \
39+
if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \
40+
if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \
41+
chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \
42+
ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \
43+
# OPENCODE ##################################################################
44+
(curl -fsSL https://opencode.ai/install | bash || true) && \
45+
mkdir -p /home/coder/.opencode/bin && \
46+
if [ -f /root/.opencode/bin/opencode ]; then cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode; fi && \
47+
chmod +x /home/coder/.opencode/bin/opencode 2>/dev/null || true && \
48+
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
49+
# NPM: CODEX, COPILOT #######################################################
50+
npm install -g @openai/codex @github/copilot && \
51+
# AGENT-BROWSER ##############################################################
52+
npm install -g agent-browser && \
53+
runuser -u coder -- agent-browser install && \
54+
# PROFILE ##################################################################
55+
echo '' >> /etc/profile && \
56+
echo '# Deno, Bun' >> /etc/profile && \
57+
echo 'export DENO_INSTALL="${DENO_INSTALL:-/usr/local}"' >> /etc/profile && \
58+
echo 'export BUN_INSTALL="${BUN_INSTALL:-/usr/local}"' >> /etc/profile && \
59+
echo '[ -d "$DENO_INSTALL/bin" ] && export PATH="$DENO_INSTALL/bin:$PATH"' >> /etc/profile && \
60+
echo '[ -d "$BUN_INSTALL/bin" ] && export PATH="$BUN_INSTALL/bin:$PATH"' >> /etc/profile && \
61+
# OWNERSHIP ################################################################
62+
chown -R coder:coder /home/coder/.local /home/coder/.opencode 2>/dev/null || true && \
63+
# CLEANUP ###################################################################
64+
apt-get clean -y && \
65+
apt-get autoclean -y && \
66+
apt-get remove -y wget && \
67+
apt-get autoremove -y && \
68+
rm -rf /var/lib/apt/lists/* /var/lib/log/* /tmp/* /var/tmp/* \
69+
/root/.npm /root/.cache /root/.local /root/.opencode /root/.bun
70+
71+
WORKDIR /home/coder
72+
73+
USER coder

php/Dockerfile

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
FROM codercom/enterprise-base:ubuntu
2+
3+
ENV NODE_VERSION=22
4+
5+
USER root
6+
7+
RUN \
8+
# REPOS ####################################################################
9+
apt-get update && \
10+
apt-get install -y --no-install-recommends curl wget software-properties-common gpg && \
11+
# Node repo (needed for npm tools)
12+
curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - && \
13+
# PHP repo
14+
add-apt-repository -y ppa:ondrej/php && \
15+
# GitHub CLI repo
16+
wget -qO /tmp/githubcli-archive-keyring.gpg https://cli.github.com/packages/githubcli-archive-keyring.gpg && \
17+
mkdir -p -m 755 /etc/apt/keyrings && \
18+
install -D -m 644 /tmp/githubcli-archive-keyring.gpg /etc/apt/keyrings/githubcli-archive-keyring.gpg && \
19+
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 && \
20+
rm -f /tmp/githubcli-archive-keyring.gpg && \
21+
# SINGLE UPDATE + INSTALL ##################################################
22+
apt-get update && \
23+
apt-get dist-upgrade -y && \
24+
apt-get install -y --no-install-recommends \
25+
git jq ripgrep nodejs \
26+
# PHP
27+
php8.5-cli php8.5-common php8.5-curl php8.5-gd php8.5-imap php8.5-intl \
28+
php8.5-mailparse php8.5-mbstring php8.5-mysql php8.5-pgsql php8.5-phpdbg \
29+
php8.5-readline php8.5-redis php8.5-soap php8.5-sqlite3 php8.5-xml \
30+
php8.5-zip php8.5-bcmath php8.5-apcu php8.5-imagick \
31+
# GitHub CLI
32+
gh \
33+
# Chrome libs (agent-browser)
34+
libnspr4 libnss3 libatk-bridge2.0-0 libdrm2 libxkbcommon0 libatspi2.0-0 \
35+
libcups2t64 libxshmfence1 libgbm1 libpango-1.0-0 libpangocairo-1.0-0 \
36+
libasound2t64 libx11-xcb1 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
37+
libxi6 libgtk-3-0t64 libcairo2 libcairo-gobject2 libgdk-pixbuf-2.0-0 \
38+
libatk1.0-0 libxrender1 libfontconfig1 libdbus-1-3 libxcb1 libxext6 libx11-6 && \
39+
echo 'variables_order = "EGPCS"' > /etc/php/8.5/cli/conf.d/99-coder.ini && \
40+
# COMPOSER ##################################################################
41+
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
42+
# CLAUDE ####################################################################
43+
(curl -fsSL https://claude.ai/install.sh | bash || true) && \
44+
mkdir -p /home/coder/.local/bin && \
45+
if [ -f /root/.local/bin/claude ]; then cp /root/.local/bin/claude /home/coder/.local/bin/claude; fi && \
46+
if [ -f /root/bin/claude ]; then cp /root/bin/claude /home/coder/.local/bin/claude; fi && \
47+
chmod +x /home/coder/.local/bin/claude 2>/dev/null || true && \
48+
ln -sf /home/coder/.local/bin/claude /usr/local/bin/claude && \
49+
# OPENCODE ##################################################################
50+
(curl -fsSL https://opencode.ai/install | bash || true) && \
51+
mkdir -p /home/coder/.opencode/bin && \
52+
if [ -f /root/.opencode/bin/opencode ]; then cp /root/.opencode/bin/opencode /home/coder/.opencode/bin/opencode; fi && \
53+
chmod +x /home/coder/.opencode/bin/opencode 2>/dev/null || true && \
54+
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
55+
# NPM: CODEX, COPILOT #######################################################
56+
npm install -g @openai/codex @github/copilot && \
57+
# AGENT-BROWSER ##############################################################
58+
npm install -g agent-browser && \
59+
runuser -u coder -- agent-browser install && \
60+
# OWNERSHIP ################################################################
61+
chown -R coder:coder /home/coder/.local /home/coder/.opencode 2>/dev/null || true && \
62+
# CLEANUP ###################################################################
63+
apt-get clean -y && \
64+
apt-get autoclean -y && \
65+
apt-get remove -y wget software-properties-common && \
66+
apt-get autoremove -y && \
67+
rm -rf /var/lib/apt/lists/* /var/lib/log/* /tmp/* /var/tmp/* \
68+
/root/.npm /root/.cache /root/.local /root/.opencode
69+
70+
WORKDIR /home/coder
71+
72+
USER coder

0 commit comments

Comments
 (0)