Alpine- and ASDF-Powered Development Containers
Lightweight Docker images built on Alpine Linux and ASDF, designed to streamline tool installation, multi-architecture support (amd64/arm64), and consistent development environments.
- Build Docker images for different tools and environments (e.g.,
asdf) across bothamd64andarm64platforms. - Automatically tag versioned builds based on upstream dependencies (e.g., Alpine, ASDF versions).
- Push to Docker Hub (
docker.io/dmascot/<image>:<version>and:latest). - Track build metadata to prevent redundant builds.
- Cleanly separate CI and local build workflows.
.
├── build.sh # Central logic for all image builds used by both CI and local build
├── local_build.sh # Local builder script;builds one image locally
├── common.sh # Shared shell functions and helpers
├── build-info.json # Metadata for last-known build versions (CI)
├── local-build-info.json # Metadata for last-known local builds (not committed to the repository)
├── images/
│ └── asdf/
│ │ ├── Dockerfile
│ │ ├── build.sh # Image-specific version logic
│ │ └── asdf_helper.sh # Script added to container image
│ └── <image_name>/
│ ├── Dockerfile
│ ├── build.sh # Image-specific version logic
│ └── <image specific script> # Script added to container image
./local_build.sh <image-name> [--dry-run]To enable debug printing:
DEBUG="true" ./local_build.sh <image-name> [--dry-run]GitHub Actions uses .github/workflows/_build-and-push.yml to build and push multi-arch images only if versions have changed. It uses build-info.json as metadata to track this.
- Create a new folder under images/, e.g. images/mytool/
- Add a Dockerfile with your image definition
- Create a build.sh file with the following structure.Ensure the function name is the same (i.e. build_image_data) and that its output is a JSON string like this:
{
"IMAGE_DATA": {
"BUILD_VERSION": "v1.0",
"TOOL_VERSION": "v0.1"
},
"BUILD_ARGS": ["KEY1=VAL1","KEY2=VAL2",..]
}Below is a simple example script:
#!/bin/bash
set -euo pipefail
build_image_data() {
local context_path="$1"
# Example version detection
local BUILD_VERSION="1.0.0"
local TOOL_VERSION="0.0.2"
jq -n \
--arg build_version "$BUILD_VERSION" \
--arg tool_version "$TOOL_VERSION" \
--argjson build_args "$(jq -n --arg ar1 "TOOL_VERSION=$tool_version" '[ $ar1 ]')" \
'{
IMAGE_DATA: {
BUILD_VERSION: $build_version,
TOOL_VERSION: $tool_version,
},
BUILD_ARGS: $build_args
}' - Ensure BUILD_VERSION is present in the file, if not you will see an error.
- BUILD_ARGS are optional and are limited to --build-arg only. They cannot be used to pass other Docker build options
Pull requests are welcome! Please follow the pattern used in images/asdf, and test your changes locally before submitting.
Images are published to: https://hub.docker.com/u/dmascot
- Run a vulnerability scan
- Support force build (i.e. rebuild even if
build-info.jsonmarks it as built) - Manage additional Docker build options if needed (i.e., beyond --build-arg)