It is a (slightly) opinionated tool for bulding images with docker buildx bake,
it currently implements a few basic commands.
Things imagine has opinions about:
- image tagging (based on git)
- image testing as a separate target
- registry as a separate notion to image name and tag with multi-registry support
- by default it will not overwrite existing tags, neither it will rebuild
Historically, docker build always needed custom automation logic. The author of imagine
has replicated various implementation between a multitude of projects. This tool was born
as docker buildx bake was released, which offers huge improvements, however it (rightly)
stops short of being opinionated. So imagine offers a few simple feature on top of it
by generating JSON build manifests.
imagine build– will build the image and (optionally) push it all specified registriesimagine image– only writes image tags to stdout- it supports a relevant subset of
imagine buildflags
- it supports a relevant subset of
imagine generate– will writes buildx manifest to stdout- it supports a relevant subset of
imagine buildflags
- it supports a relevant subset of
imagine has two tagging modes:
- git revision or semver tag - used when imege build is defined by the entier repository
- this mode is enabled with
--root - only semver git tags are recognised, any non-semver tags are ignored
- when multiple git tag point to the same commit, the highest version is picked
- this mode is enabled with
- git tree hash - used when image build is defined by a subdirecotry
At present git tree hash format is a full-lenght SHA1, while git revision is a short SHA1
(git rev-parse --short). This may change in the future, it may also be possible to pass
tag prefix or a custom image tag.
When there changes to any of the checked-in files, -wip suffix is appended. When the build
is not a base branch (can be set with --base-brach and defaults to master), a -dev suffix
is appended. This behaviour can be controlled with --without-tag-suffix.
Images are rebuilt only when there is no remote image in at least one of the given registries. With git revsion tagging mode this means only new revisions are re-built, and with git tree hash mode it means that new images are built only whenever there are changes to the given subdirectory that defines the image.
A rebuild can be force with --force, or when either of the suffices (-dev and/or -wip)
had been appended to the image.
If you have tests defined in FROM ... as test section of your Dockerfile, you can use
--test flag to run those tests.
First, you need to make sure to setup a BuildKit instance:
builder="$(docker buildx create)"
You can use any pre-existing BuildKit instance (check docker buildx ls), but you cannot use
the default docker driver, as it only suppors a limited set of buildx features.
And, pick your username, e.g.:
username=errordeveloper
To build an image that takes examples/alpine subdircorey as input, run:
imagine build \
--builder "${builder}" \
--registry "docker.io/${username}" \
--registry "quay.io/${username}" \
--name imagine-alpine-example \
--base ./examples/alpine \
To build an image that is defined by entier repository, run:
imagine build \
--builder "${builder}" \
--registry "docker.io/${username}" \
--registry "quay.io/${username}" \
--name imagine-imagine-example \
--root \
--base ./ \
--dockerfile ./examples/imagine/Dockerfile