diff --git a/images/kitchensink/README.md b/images/kitchensink/README.md new file mode 100644 index 0000000..784fdcf --- /dev/null +++ b/images/kitchensink/README.md @@ -0,0 +1,16 @@ +# Example Kitchensink Image + +[![Docker Pulls](https://img.shields.io/docker/pulls/codercom/example-kitchensink?label=codercom%2Fexample-kitchensink)](https://hub.docker.com/r/codercom/example-kitchensink) + +## Description + +A multi-language "kitchen sink" image built on `codercom/enterprise-base:ubuntu`, published for `linux/amd64` and `linux/arm64`. It offers a multi-arch alternative to the `universal` image, whose upstream base ([Microsoft's Universal Dev Container Image](https://github.com/devcontainers/images/tree/main/src/universal)) is only published for amd64. + +Toolchains are installed via Homebrew (Tier 1 on Linux ARM64 as of Homebrew 5.0), plus dedicated version managers: + +- Homebrew: Go (with `gofumpt`, `golangci-lint`, `staticcheck`), Node.js (with `yarn`, `pnpm`, `fnm`), Ruby, Kotlin, Gradle, Maven, `mise`, `just`, `ninja`, `cmake`, OpenTofu, `fish`, `typos-cli`, `clang-format`, `pkgconf`, `rebar3` +- `uv` with a default Python install +- Rust via `rustup` (with `cargo-binstall` and `cargo-nextest`) +- Docker, Git, and common shell utilities inherited from the base image + +All user-facing tooling runs as the `coder` user. diff --git a/images/kitchensink/first-run-notice.txt b/images/kitchensink/first-run-notice.txt new file mode 100644 index 0000000..1e3a24f --- /dev/null +++ b/images/kitchensink/first-run-notice.txt @@ -0,0 +1,7 @@ +Welcome to Coder! This environment includes a suite of common tools and languages +managed via Homebrew, mise, uv, fnm, and rustup (Go, Node.js, Python, Rust, Ruby, +Java/Kotlin, and more) for both amd64 and arm64. + +➡️ https://github.com/coder/images/tree/main/images/kitchensink + +To use another image, modify your devcontainer.json or your Coder Template. diff --git a/images/kitchensink/ubuntu.Dockerfile b/images/kitchensink/ubuntu.Dockerfile new file mode 100644 index 0000000..569572c --- /dev/null +++ b/images/kitchensink/ubuntu.Dockerfile @@ -0,0 +1,110 @@ +FROM codercom/enterprise-base:ubuntu + +# Run everything as root +USER root + +SHELL ["/bin/bash", "-c"] +ENV DEBIAN_FRONTEND=noninteractive + +################################################################################ +# System packages # +################################################################################ + +# The base image already provides build-essential, curl, git, jq, sudo, +# wget, python3, pipx, and Docker. +RUN apt-get update && \ + apt-get install --yes --no-install-recommends --no-install-suggests \ + autoconf \ + automake \ + ca-certificates \ + cmake \ + less \ + sqlite3 \ + zsh \ + && rm -rf /var/lib/apt/lists/* + +COPY first-run-notice.txt /usr/local/etc/vscode-dev-containers/ + +# Everything below installs into user-owned prefixes as the coder user. +USER coder +ENV HOME=/home/coder +ENV PATH=$HOME/.local/bin:$PATH + +################################################################################ +# Homebrew # +################################################################################ + +# Homebrew 5.0 supports Linux ARM64/AArch64 as Tier 1, so bottles exist +# for both platforms this image builds for. +ENV PATH=/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH +RUN NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + +RUN brew install \ + cargo-binstall \ + clang-format \ + fish \ + fnm \ + go \ + gofumpt \ + golangci-lint \ + gradle \ + just \ + kotlin \ + maven \ + mise \ + ninja \ + node \ + opentofu \ + pkgconf \ + pnpm \ + rebar3 \ + ruby \ + staticcheck \ + typos-cli \ + uv \ + yarn \ + && brew cleanup --prune=all && \ + rm -rf "$(brew --cache)" + +# openjdk is keg-only in Homebrew, so expose it explicitly for tools +# that expect java on PATH. +ENV JAVA_HOME=/home/linuxbrew/.linuxbrew/opt/openjdk +ENV PATH=$PATH:$JAVA_HOME/bin + +################################################################################ +# uv # +################################################################################ + +RUN uv python install --default 3.14 + +################################################################################ +# rustup # +################################################################################ + +ENV PATH=$HOME/.cargo/bin:$PATH +RUN curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs | sh -s -- -y \ + --no-modify-path + +RUN cargo binstall cargo-nextest --secure + +################################################################################ +# go # +################################################################################ + +ENV GOPATH=$HOME/go +ENV GOBIN=$GOPATH/bin +ENV PATH=$PATH:$GOBIN + +################################################################################ +# Sanity checks # +################################################################################ + +RUN brew --version && \ + mise --version && \ + go version && \ + node -v && npm -v && yarn -v && pnpm -v && fnm --version && \ + uv --version && python3 --version && \ + cargo -V && cargo nextest --version && \ + ruby --version && \ + java -version && gradle --version && mvn --version && \ + just --version && tofu version diff --git a/scripts/images.sh b/scripts/images.sh index 36a2ed3..e6c4e4b 100644 --- a/scripts/images.sh +++ b/scripts/images.sh @@ -17,4 +17,5 @@ IMAGES=( "node" "desktop" "universal" + "kitchensink" )