Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 17 additions & 9 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,12 @@ permissions:

jobs:
test:
name: "Test"
name: "Test (${{ matrix.image }})"
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
image: [fx, php, nodejs, golang, python]
steps:
- name: Checkout
uses: actions/checkout@v6
Expand All @@ -25,20 +29,24 @@ jobs:
- name: Build image for testing
uses: docker/build-push-action@v7
with:
context: ./fx
file: ./fx/Dockerfile
context: ./${{ matrix.image }}
file: ./${{ matrix.image }}/Dockerfile
push: false
tags: dockette/coder:fx-test
tags: dockette/coder:${{ matrix.image }}-test
platforms: linux/amd64
load: true

- name: Smoke test image
run: make test DOCKER_TAG=fx-test
run: make test DOCKER_VARIANT=${{ matrix.image }} DOCKER_TAG=${{ matrix.image }}-test

build:
name: "Build"
name: "Build (${{ matrix.image }})"
needs: test
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
image: [fx, php, nodejs, golang, python]
steps:
- name: Checkout
uses: actions/checkout@v6
Expand All @@ -58,10 +66,10 @@ jobs:
- name: Build and push
uses: docker/build-push-action@v7
with:
context: ./fx
file: ./fx/Dockerfile
context: ./${{ matrix.image }}
file: ./${{ matrix.image }}/Dockerfile
push: ${{ github.ref == 'refs/heads/master' }}
tags: dockette/coder:fx
tags: dockette/coder:${{ matrix.image }}
platforms: linux/amd64
cache-from: type=gha
cache-to: type=gha
64 changes: 56 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,23 +1,71 @@
DOCKER_IMAGE=dockette/coder
DOCKER_TAG?=fx
DOCKER_VARIANT?=fx
DOCKER_TAG?=$(DOCKER_VARIANT)
DOCKER_PLATFORMS?=linux/amd64

# Shared tools present in all images
TOOLS_COMMON=agent-browser gh claude opencode codex copilot

.PHONY: build
build:
docker buildx build --platform ${DOCKER_PLATFORMS} -t ${DOCKER_IMAGE}:${DOCKER_TAG} fx/
docker buildx build --platform ${DOCKER_PLATFORMS} -t ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_VARIANT}/

.PHONY: build-all
build-all:
$(MAKE) build DOCKER_VARIANT=fx
$(MAKE) build DOCKER_VARIANT=php
$(MAKE) build DOCKER_VARIANT=nodejs
$(MAKE) build DOCKER_VARIANT=golang
$(MAKE) build DOCKER_VARIANT=python

.PHONY: test
test:
$(MAKE) test-${DOCKER_VARIANT}

.PHONY: test-all
test-all:
$(MAKE) test-fx
$(MAKE) test-php
$(MAKE) test-nodejs
$(MAKE) test-golang
$(MAKE) test-python

.PHONY: test-fx
test-fx:
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} node --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} npm --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} node -e "console.log(process.arch)"
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} go version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} python3 --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} pip3 --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} php --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} composer --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} deno --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} bun --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} agent-browser --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} gh --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} claude --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} opencode --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} codex --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} copilot --version
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)

.PHONY: test-php
test-php:
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} php --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} composer --version
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)

.PHONY: test-nodejs
test-nodejs:
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} node --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} npm --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} node -e "console.log(process.arch)"
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} deno --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} bun --version
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)

.PHONY: test-golang
test-golang:
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} go version
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)

.PHONY: test-python
test-python:
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} python3 --version
docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} pip3 --version
$(foreach tool,$(TOOLS_COMMON),docker run --rm --platform ${DOCKER_PLATFORMS} ${DOCKER_IMAGE}:${DOCKER_TAG} $(tool) --version;)
83 changes: 55 additions & 28 deletions fx/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,59 @@ FROM codercom/enterprise-base:ubuntu
ENV DENO_INSTALL=/usr/local
ENV BUN_INSTALL=/usr/local
ENV NODE_VERSION=22
ENV GO_VERSION=1.24.2
ENV GOROOT=/usr/local/go
ENV GOPATH=/home/coder/go
ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH

USER root

RUN apt update && apt dist-upgrade -y && \
mkdir -p -m 755 /etc/apt/keyrings && \
apt install -y curl git wget htop jq ripgrep && \
# NODE ######################################################################
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 && \
# Node repo
curl -fsSL "https://deb.nodesource.com/setup_${NODE_VERSION}.x" | bash - && \
apt install -y nodejs && \
# PHP #######################################################################
# PHP repo
add-apt-repository -y ppa:ondrej/php && \
apt update -y && \
apt install -y --no-install-recommends \
# 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 \
# Node
nodejs \
# PHP
php8.5-cli php8.5-common php8.5-curl php8.5-gd php8.5-imap 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-zip php8.5-bcmath php8.5-apcu php8.5-imagick \
# Python
python3 python3-pip python3-venv \
# 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 && \
# GITHUB CLI ################################################################
wget -qO /tmp/githubcli-archive-keyring.gpg https://cli.github.com/packages/githubcli-archive-keyring.gpg && \
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 && \
apt update -y && \
apt install -y --no-install-recommends gh && \
# DENO ######################################################################
curl -fsSL https://deno.land/install.sh | sh && \
# BUN #######################################################################
Expand All @@ -48,30 +75,30 @@ RUN apt update && apt dist-upgrade -y && \
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
# NPM: CODEX, COPILOT #######################################################
npm install -g @openai/codex @github/copilot && \
# CHROME LIBS (AGENT-BROWSER) ###############################################
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
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 && \
# AGENT-BROWSER ##############################################################
npm install -g agent-browser && \
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 && \
# OWNERSHIP (coder can upgrade tools) ######################################
chown -R coder:coder /home/coder/.local /home/coder/.opencode 2>/dev/null || true && \
chown -R coder:coder /home/coder/.local /home/coder/.opencode /home/coder/go 2>/dev/null || true && \
# CLEANUP ###################################################################
apt clean -y && \
apt autoclean -y && \
apt remove -y wget && \
apt autoremove -y && \
rm -rf /var/lib/apt/lists/* /var/lib/log/* /tmp/* /var/tmp/*
apt-get clean -y && \
apt-get autoclean -y && \
apt-get remove -y wget software-properties-common && \
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

Expand Down
76 changes: 76 additions & 0 deletions golang/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
FROM codercom/enterprise-base:ubuntu

ENV NODE_VERSION=22
ENV GO_VERSION=1.24.2
ENV GOROOT=/usr/local/go
ENV GOPATH=/home/coder/go
ENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH

USER root

RUN \
# REPOS ####################################################################
apt-get update && \
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 - && \
# 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 nodejs 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 && \
# 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 && \
# CLAUDE ####################################################################
(curl -fsSL https://claude.ai/install.sh | bash || 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 && \
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) && \
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 && \
ln -sf /home/coder/.opencode/bin/opencode /usr/local/bin/opencode && \
# NPM: CODEX, COPILOT #######################################################
npm install -g @openai/codex @github/copilot && \
# AGENT-BROWSER ##############################################################
npm install -g agent-browser && \
runuser -u coder -- agent-browser install && \
# PROFILE ##################################################################
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 && \
# OWNERSHIP ################################################################
chown -R coder:coder /home/coder/.local /home/coder/.opencode /home/coder/go 2>/dev/null || true && \
# 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

WORKDIR /home/coder

USER coder
Loading