Docker images for AtCoder language environments.
- Pick the selector for the language you want. The safest choice is the
info/*.tomlfilename stem. - Pull the image:
docker pull ghcr.io/cputils/atcoder-docker-images/<normalized-stem>:2025-10- Run it with your source mounted into
/judge:
docker run --rm -it -v "$PWD:/judge" ghcr.io/cputils/atcoder-docker-images/<normalized-stem>:2025-10 bashInside the container, work in /judge and use the language tools directly.
Each image is built by running the install step in its metadata file. Common pieces include:
- Base image:
ubuntu:24.04 - Shared packages:
bash,curl,git,python3,build-essential, and more - Working directory:
/judge - Metadata:
/opt/atcoder/info.toml - Install script:
/opt/atcoder/atcoder-install.sh - Default shell at runtime:
bash
Each image is defined by one info/*.toml file. That file is the source of truth for the image and usually contains:
language: a short language namedisplay: the user-facing name shown in selectorsinstall: the build-time setup scriptcompile: the compile check or command, when presentexecution: the runtime command, when presentfilename: the main source filename expected by the runtime, when presentlicenseandlibrary: dependency metadata, when present
If you are choosing an image, start with the filename stem under info/, then check the display field when needed.
patches/ contains short notes for images that need extra handling. The patch filename matches the image stem, and each file names its target language:
If a language has a patch file, read it before using that image.
uv run build.py python-cpython-3-13-7selector can be any of:
- the
info/*.tomlfilename stem - the
languagefield - the
displayfield
Examples:
uv run build.py "Python"
uv run build.py "Python (CPython 3.13.7)"
uv run build.py python-cpython-3-13-7The local tag after building is "<normalized-stem>:2025-10".
For example, python-cpython-3-13-7 becomes python-cpython-3-13-7:2025-10.
docker run --rm -it python-cpython-3-13-7:2025-10 bashThe working directory is /judge. Put your source files there and use tools like python and g++ directly.
This is only needed if you are publishing a new image.
uv run upload.py python-cpython-3-13-7upload.py resolves the GHCR namespace in this order:
GITHUB_REPOSITORYremote.origin.url
It accepts credentials from either:
GHCR_USERNAME+GHCR_TOKENGITHUB_ACTOR+GITHUB_TOKEN
If neither is set, it falls back to the gh CLI.
The full pushed image reference is:
ghcr.io/cputils/atcoder-docker-images/<normalized-stem>:2025-10
Two workflows are included:
build-and-upload-language.yml- builds and uploads one selector
build-and-upload-all-languages.yml- builds and uploads all languages
- supports
skip_selectorsto exclude specific images