Dockerfile
Learn about how to create a Dockerfile for a language
A Dockerfile is used to build the Docker container where a user’s code will be run. We require one Dockerfile per language version supported.
Dockerfiles are stored in the dockerfiles
directory of a challenge repository.
Language Versions
We support multiple versions of a language by creating a Dockerfile for each version.
The name of the Dockerfile should match the language_pack
value used in the starter code’s codecrafters.yml
file.
For example, for the dockerfile python-3.11.Dockerfile
, the relevant section in codecrafters.yml
will look something like this:
A language pack usually only specifies the minor version of a language. For example, we support python-3.11
and python-3.12
but not python-3.11.1
.
Dockerfile Structure
- Where available, use the official Docker image for the language.
- Where available, use an image based on
alpine
to reduce the size of the image. - A Dockerfile must install all dependencies required to run the user’s code.
- It must copy in the minimal set of files from the user’s code required to install dependencies. For example, for Rust this’d be
Cargo.toml
andCargo.lock
. - It must then run the dependency installation command. For example, for Rust this’d be
cargo build --release
.
- It must copy in the minimal set of files from the user’s code required to install dependencies. For example, for Rust this’d be
- The files required to build dependencies must be stored as CSV in the
CODECRAFTERS_DEPENDENCY_FILE_PATHS
environment variable, so that CodeCrafters can detect changes in them and trigger a rebuild when needed. - A Dockerfile must only copy in the User’s code as the last step. This allows us to share the cached layers between different users.
- The resulting image should conform to the Test Runner Image Interface.
Was this page helpful?