@git.zone/tsdocker

Documentation for @git.zone/tsdocker

readme.md for @git.zone/tsdocker

🐳 The ultimate Docker development toolkit for TypeScript projects β€” build, test, and ship multi-arch containerized applications with zero friction.

Issue Reporting and Security

For reporting bugs, issues, or security vulnerabilities, please visit community.foss.global/. This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a code.foss.global/ account to submit Pull Requests directly.

What is tsdocker?

tsdocker is a comprehensive Docker development and build tool that handles everything from testing npm packages in clean environments to building and pushing multi-architecture Docker images across multiple registries β€” all from a single CLI.

🎯 Key Capabilities

Installation

# Global installation (recommended for CLI usage)
npm install -g @git.zone/tsdocker

# Or project-local installation
pnpm install --save-dev @git.zone/tsdocker

Quick Start

πŸ—οΈ Build Docker Images

Got Dockerfile files? Build them all with automatic dependency ordering:

tsdocker build

tsdocker will:

  1. πŸ” Discover all Dockerfile* files in your project
  2. πŸ“Š Analyze FROM dependencies between them
  3. πŸ”„ Sort them topologically
  4. πŸ—οΈ Build each image in the correct order
  5. πŸ“¦ Push every image to a persistent local registry (.nogit/docker-registry/)

πŸ“€ Push to Registries

Ship your images to one or all configured registries:

# Push to all configured registries
tsdocker push

# Push to a specific registry
tsdocker push --registry=registry.gitlab.com

# Push without rebuilding (use existing images in local registry)
tsdocker push --no-build

Under the hood, tsdocker push uses the OCI Distribution API to copy images directly from the local registry to remote registries. This means multi-arch manifest lists are preserved end-to-end β€” no more single-platform-only pushes. Every request is protected with automatic retry (up to 6 attempts with exponential backoff) and 5-minute timeouts, so transient network issues don't kill your push mid-transfer.

🎯 Build Only Specific Dockerfiles

Target specific Dockerfiles by name pattern β€” dependencies are resolved automatically:

# Build only the base image
tsdocker build Dockerfile_base

# Build anything matching a glob pattern
tsdocker build Dockerfile_app*

# Push specific images only (skip build phase)
tsdocker push --no-build Dockerfile_api Dockerfile_web

CLI Commands

Command Description
tsdocker Show usage / man page
tsdocker build Build all Dockerfiles with dependency ordering
tsdocker push Build + push images to configured registries
tsdocker pull <registry> Pull images from a specific registry
tsdocker test Build + run container test scripts (test_*.sh)
tsdocker login Authenticate with configured registries
tsdocker list Display discovered Dockerfiles and their dependencies
tsdocker config Manage global tsdocker configuration (remote builders, etc.)
tsdocker clean Interactively clean Docker environment

Build Flags

Flag Description
<patterns> Positional Dockerfile name patterns (e.g. Dockerfile_base, Dockerfile_app*)
--platform=linux/arm64 Override build platform for a single architecture
--timeout=600 Build timeout in seconds
--no-cache Force rebuild without Docker layer cache
--cached Skip unchanged Dockerfiles (content-hash based)
--verbose Stream raw docker build output
--parallel Enable level-based parallel builds (default concurrency: 4)
--parallel=8 Parallel builds with custom concurrency
--context=mycontext Use a specific Docker context

Push Flags

Flag Description
<patterns> Positional Dockerfile name patterns to select which images to push
--registry=<url> Push to a single specific registry instead of all configured
--no-build Skip the build phase; only push existing images from local registry

Config Subcommands

Subcommand Description
add-builder Add or update a remote builder node
remove-builder Remove a remote builder by name
list-builders List all configured remote builders
show Show the full global configuration

add-builder flags:

Flag Description
--name=<name> Builder name (e.g. arm64-builder)
--host=<user@ip> SSH host (e.g. armbuilder@192.168.1.100)
--platform=<p> Target platform (e.g. linux/arm64)
--ssh-key=<path> SSH key path (optional, uses SSH agent/config by default)

Clean Flags

Flag Description
--all Include all images and volumes (not just dangling)
-y Auto-confirm all prompts

Configuration

Configure tsdocker in your .smartconfig.json under the @git.zone/tsdocker key:

{
  "@git.zone/tsdocker": {
    "registries": ["registry.gitlab.com", "docker.io"],
    "registryRepoMap": {
      "registry.gitlab.com": "myorg/myproject"
    },
    "buildArgEnvMap": {
      "NODE_VERSION": "NODE_VERSION"
    },
    "platforms": ["linux/amd64", "linux/arm64"],
    "testDir": "./test"
  }
}

Configuration Options

Build & Push Options

Option Type Default Description
registries string[] [] Registry URLs to push to
registryRepoMap object {} Map registries to different repository paths
buildArgEnvMap object {} Map Docker build ARGs to environment variables
platforms string[] ["linux/amd64"] Target architectures for multi-arch builds
testDir string ./test Directory containing test scripts

Architecture: How tsdocker Works

tsdocker uses a local OCI registry as the canonical store for all built images. This design solves fundamental problems with Docker's local daemon, which cannot hold multi-architecture manifest lists.

πŸ“ Build Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  tsdocker build                                     β”‚
β”‚                                                     β”‚
β”‚  1. Start local registry (localhost:<dynamic-port>)  β”‚
β”‚     └── Persistent volume: .nogit/docker-registry/  β”‚
β”‚                                                     β”‚
β”‚  2. For each Dockerfile (topological order):         β”‚
β”‚     β”œβ”€β”€ Multi-platform: buildx --push β†’ registry    β”‚
β”‚     └── Single-platform: docker build β†’ registry    β”‚
β”‚                                                     β”‚
β”‚  3. Stop local registry (data persists on disk)      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“€ Push Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  tsdocker push                                         β”‚
β”‚                                                        β”‚
β”‚  1. Start local registry (loads persisted data)         β”‚
β”‚                                                        β”‚
β”‚  2. For each image Γ— each remote registry:              β”‚
β”‚     └── OCI Distribution API copy (with retry):        β”‚
β”‚         β”œβ”€β”€ Fetch manifest (single or multi-arch)       β”‚
β”‚         β”œβ”€β”€ Copy blobs (skip if already exist)          β”‚
β”‚         β”œβ”€β”€ Retry up to 6Γ— with exponential backoff    β”‚
β”‚         └── Push manifest with destination tag          β”‚
β”‚                                                        β”‚
β”‚  3. Stop local registry                                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”‘ Why a Local Registry?

Problem Solution
docker buildx --load fails for multi-arch images buildx --push to local registry works for any number of platforms
docker push only pushes single-platform manifests OCI API copy preserves full manifest lists (multi-arch)
Images lost between build and push phases Persistent storage at .nogit/docker-registry/ survives restarts
Redundant blob uploads on incremental pushes HEAD checks skip blobs that already exist on the remote

πŸ” Resilient Push

The OCI Distribution API client wraps every HTTP request with:

This means transient issues like stale connection pools, brief network blips, or token expiry during long multi-arch pushes (56+ blob operations) are handled gracefully instead of killing the entire transfer.

🏭 CI-Safe Session Isolation

Every tsdocker invocation gets its own session with unique:

This prevents resource conflicts when multiple CI jobs run tsdocker in parallel. Auto-detected CI systems:

Environment Variable CI System
GITEA_ACTIONS Gitea Actions
GITHUB_ACTIONS GitHub Actions
GITLAB_CI GitLab CI
CI Generic CI

In local dev, no suffix is added β€” keeping a persistent builder for faster rebuilds.

πŸ” Docker Context & Topology Detection

tsdocker automatically detects your Docker environment topology:

Topology Detection Meaning
local Default Standard Docker installation on the host
socket-mount /.dockerenv exists Running inside a container with Docker socket mounted
dind DOCKER_HOST starts with tcp:// Docker-in-Docker setup

Context-aware builder names (tsdocker-builder-<context>) prevent conflicts across Docker contexts. Rootless Docker configurations trigger appropriate warnings.

Registry Authentication

Environment Variables

# Pipe-delimited format (supports DOCKER_REGISTRY_1 through DOCKER_REGISTRY_10)
export DOCKER_REGISTRY_1="registry.gitlab.com|username|password"
export DOCKER_REGISTRY_2="docker.io|username|password"

# Individual registry format
export DOCKER_REGISTRY_URL="registry.gitlab.com"
export DOCKER_REGISTRY_USER="username"
export DOCKER_REGISTRY_PASSWORD="password"

Docker Config Fallback

When pushing, tsdocker will also read credentials from ~/.docker/config.json if no explicit credentials are provided via environment variables. This means docker login credentials work automatically. Docker Hub special cases (docker.io, index.docker.io, registry-1.docker.io) are all recognized.

Login Command

tsdocker login

Authenticates with all configured registries using the provided environment variables.

Advanced Usage

πŸ”€ Multi-Architecture Builds

Build for multiple platforms using Docker Buildx:

{
  "@git.zone/tsdocker": {
    "platforms": ["linux/amd64", "linux/arm64"]
  }
}

tsdocker automatically:

πŸ–₯️ Native Remote Builders

Instead of relying on slow QEMU emulation for cross-platform builds, tsdocker can use native remote machines via SSH as build nodes. For example, use a real arm64 machine for linux/arm64 builds:

# Add a remote arm64 builder
tsdocker config add-builder \
  --name=arm64-builder \
  --host=armbuilder@192.168.1.100 \
  --platform=linux/arm64 \
  --ssh-key=~/.ssh/id_ed25519

# List configured builders
tsdocker config list-builders

# Remove a builder
tsdocker config remove-builder --name=arm64-builder

# Show full global config
tsdocker config show

Global configuration is stored at ~/.git.zone/tsdocker/config.json.

How it works:

When remote builders are configured and the project's platforms includes a matching platform, tsdocker automatically:

  1. Creates a multi-node buildx builder β€” local node for linux/amd64, remote SSH node for linux/arm64
  2. Opens SSH reverse tunnels so the remote builder can push to the local staging registry
  3. Builds natively on each platform's hardware β€” no QEMU overhead
  4. Tears down tunnels after the build completes
[Local machine]                        [Remote arm64 machine]
  registry:2 on localhost:PORT  <──── SSH reverse tunnel ──── localhost:PORT
  BuildKit (amd64) ──push──>            BuildKit (arm64) ──push──>
     localhost:PORT                        localhost:PORT (tunneled)

Prerequisites for the remote machine:

⚑ Parallel Builds

Speed up builds by building independent images concurrently:

# Default concurrency (4 workers)
tsdocker build --parallel

# Custom concurrency
tsdocker build --parallel=8

# Works with caching too
tsdocker build --parallel --cached

tsdocker groups Dockerfiles into dependency levels using topological analysis. Images within the same level have no dependencies on each other and build in parallel. Each level completes before the next begins.

πŸ“¦ Dockerfile Naming Conventions

tsdocker discovers files matching Dockerfile*:

File Name Version Tag
Dockerfile latest
Dockerfile_v1.0.0 v1.0.0
Dockerfile_alpine alpine
Dockerfile_##version## Uses package.json version

🎯 Dockerfile Filtering

Build or push only the Dockerfiles you need. Positional arguments are matched against Dockerfile basenames as glob patterns:

# Build a single Dockerfile
tsdocker build Dockerfile_base

# Glob patterns with * and ? wildcards
tsdocker build Dockerfile_app*

# Multiple patterns
tsdocker build Dockerfile_base Dockerfile_web

# Push specific images without rebuilding
tsdocker push --no-build Dockerfile_api

When filtering for build, dependencies are auto-resolved: if Dockerfile_app depends on Dockerfile_base, specifying only Dockerfile_app will automatically include Dockerfile_base in the build order.

πŸ”— Dependency-Aware Builds

If you have multiple Dockerfiles that depend on each other:

# Dockerfile_base
FROM node:20-alpine
RUN npm install -g typescript

# Dockerfile_app
FROM myproject:base
COPY . .
RUN npm run build

tsdocker automatically detects that Dockerfile_app depends on Dockerfile_base, builds them in the correct order, and makes the base image available to dependent builds via the local registry (using --build-context for buildx).

πŸ§ͺ Container Test Scripts

Create test scripts in your test directory:

# test/test_latest.sh
#!/bin/bash
node --version
npm --version
echo "Container tests passed!"

Run with:

tsdocker test

This builds all images, starts the local registry (so multi-arch images can be pulled), and runs each matching test script inside a container.

πŸ”§ Build Args from Environment

Pass environment variables as Docker build arguments:

{
  "@git.zone/tsdocker": {
    "buildArgEnvMap": {
      "NPM_TOKEN": "NPM_TOKEN",
      "NODE_VERSION": "NODE_VERSION"
    }
  }
}
ARG NPM_TOKEN
ARG NODE_VERSION=20
FROM node:${NODE_VERSION}
RUN echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc

πŸ—ΊοΈ Registry Repo Mapping

Use different repository names for different registries:

{
  "@git.zone/tsdocker": {
    "registries": ["registry.gitlab.com", "docker.io"],
    "registryRepoMap": {
      "registry.gitlab.com": "mygroup/myproject",
      "docker.io": "myuser/myproject"
    }
  }
}

When pushing, tsdocker maps the local repo name to the registry-specific path. For example, a locally built myproject:latest becomes registry.gitlab.com/mygroup/myproject:latest and docker.io/myuser/myproject:latest.

πŸ“‹ Listing Dockerfiles

Inspect your project's Dockerfiles and their relationships:

tsdocker list

Output:

Discovered Dockerfiles:
========================

1. /path/to/Dockerfile_base
   Tag: myproject:base
   Base Image: node:20-alpine
   Version: base

2. /path/to/Dockerfile_app
   Tag: myproject:app
   Base Image: myproject:base
   Version: app
   Depends on: myproject:base

Examples

Minimal Build & Push

{
  "@git.zone/tsdocker": {
    "registries": ["docker.io"],
    "platforms": ["linux/amd64"]
  }
}
tsdocker push

Full Production Setup

{
  "@git.zone/tsdocker": {
    "registries": ["registry.gitlab.com", "ghcr.io", "docker.io"],
    "registryRepoMap": {
      "registry.gitlab.com": "myorg/myapp",
      "ghcr.io": "myorg/myapp",
      "docker.io": "myuser/myapp"
    },
    "buildArgEnvMap": {
      "NPM_TOKEN": "NPM_TOKEN"
    },
    "platforms": ["linux/amd64", "linux/arm64"],
    "testDir": "./docker-tests"
  }
}

CI/CD Integration

GitLab CI:

build-and-push:
  stage: build
  script:
    - npm install -g @git.zone/tsdocker
    - tsdocker push
  variables:
    DOCKER_REGISTRY_1: 'registry.gitlab.com|$CI_REGISTRY_USER|$CI_REGISTRY_PASSWORD'

GitHub Actions:

- name: Build and Push
  run: |
    npm install -g @git.zone/tsdocker
    tsdocker login
    tsdocker push
  env:
    DOCKER_REGISTRY_1: 'ghcr.io|${{ github.actor }}|${{ secrets.GITHUB_TOKEN }}'

Gitea Actions:

- name: Build and Push
  run: |
    npm install -g @git.zone/tsdocker
    tsdocker push
  env:
    DOCKER_REGISTRY_1: 'gitea.example.com|${{ secrets.REGISTRY_USER }}|${{ secrets.REGISTRY_PASSWORD }}'

tsdocker auto-detects all three CI systems and enables session isolation automatically β€” no extra configuration needed.

TypeScript API

tsdocker can also be used programmatically:

import { TsDockerManager } from '@git.zone/tsdocker/dist_ts/classes.tsdockermanager.js';
import type { ITsDockerConfig } from '@git.zone/tsdocker/dist_ts/interfaces/index.js';

const config: ITsDockerConfig = {
  registries: ['docker.io'],
  platforms: ['linux/amd64', 'linux/arm64'],
};

const manager = new TsDockerManager(config);
await manager.prepare();
await manager.build({ parallel: true });
await manager.push();

Environment Variables

CI & Session Control

Variable Description
TSDOCKER_SESSION_ID Override the auto-generated session ID (default: random 8-char hex)
TSDOCKER_REGISTRY_PORT Override the dynamically allocated local registry port
CI Generic CI detection (also GITHUB_ACTIONS, GITLAB_CI, GITEA_ACTIONS)

Registry Credentials

Variable Description
DOCKER_REGISTRY_1 through DOCKER_REGISTRY_10 Pipe-delimited: registry|username|password
DOCKER_REGISTRY_URL Registry URL for single-registry setup
DOCKER_REGISTRY_USER Username for single-registry setup
DOCKER_REGISTRY_PASSWORD Password for single-registry setup

Requirements

Troubleshooting

"docker not found"

Ensure Docker is installed and in your PATH:

docker --version

Multi-arch build fails

Make sure Docker Buildx is available. tsdocker will set up the builder automatically, but you can verify:

docker buildx version

Registry authentication fails

Check your environment variables are set correctly:

echo $DOCKER_REGISTRY_1
tsdocker login

tsdocker also falls back to ~/.docker/config.json β€” ensure you've run docker login for your target registries.

Push fails with "fetch failed"

tsdocker automatically retries failed requests up to 6 times with exponential backoff. If pushes still fail:

Circular dependency detected

Review your Dockerfiles' FROM statements β€” you have images depending on each other in a loop.

Build context too large

Use a .dockerignore file to exclude node_modules, .git, .nogit, and other large directories:

node_modules
.git
.nogit
dist_ts

This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the LICENSE file.

Please note: The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.

Trademarks

This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.

Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.

Company Information

Task Venture Capital GmbH Registered at District Court Bremen HRB 35230 HB, Germany

By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

changelog.md for @git.zone/tsdocker

2026-03-24 - 2.2.4 - fix(config)

migrate configuration loading to smartconfig and update build tooling compatibility

2026-03-24 - 2.2.3 - fix(config)

update workflow repository URL handling and package config file references

2026-03-24 - 2.2.2 - fix(config)

rename npmextra configuration file to .smartconfig.json

2026-03-24 - 2.2.1 - fix(config)

switch configuration loading from npmextra to smartconfig

2026-03-19 - 2.2.0 - feat(cli/buildx)

add pull control for builds and isolate buildx builders per project

2026-03-15 - 2.1.0 - feat(cli)

add global remote builder configuration and native SSH buildx nodes for multi-platform builds

2026-03-12 - 2.0.2 - fix(repo)

no changes to commit

2026-03-12 - 2.0.1 - fix(repository)

no changes to commit

2026-03-12 - 2.0.0 - BREAKING CHANGE(cli)

remove legacy container test runner and make the default command show the man page

2026-02-07 - 1.17.4 - fix()

no changes

2026-02-07 - 1.17.3 - fix(registry)

increase default maxRetries in fetchWithRetry from 3 to 6 to improve resilience when fetching registry resources

2026-02-07 - 1.17.2 - fix(registry)

improve HTTP fetch retry logging, backoff calculation, and token-cache warning

2026-02-07 - 1.17.1 - fix(registrycopy)

add fetchWithRetry wrapper to apply timeouts, retries with exponential backoff, and token cache handling; use it for registry HTTP requests

2026-02-07 - 1.17.0 - feat(tsdocker)

add Dockerfile filtering, optional skip-build flow, and fallback Docker config credential loading

2026-02-07 - 1.16.0 - feat(core)

Introduce per-invocation TsDockerSession and session-aware local registry and build orchestration; stream and parse buildx output for improved logging and visibility; detect Docker topology and add CI-safe cleanup; update README with multi-arch, parallel-build, caching, and local registry usage and new CLI flags.

2026-02-07 - 1.15.1 - fix(registry)

use persistent local registry and OCI Distribution API image copy for pushes

2026-02-07 - 1.15.0 - feat(clean)

Make the clean command interactive: add smartinteract prompts, docker context detection, and selective resource removal with support for --all and -y auto-confirm

2026-02-07 - 1.14.0 - feat(build)

add level-based parallel builds with --parallel and configurable concurrency

2026-02-07 - 1.13.0 - feat(docker)

add Docker context detection, rootless support, and context-aware buildx registry handling

2026-02-06 - 1.12.0 - feat(docker)

add detailed logging for buildx, build commands, local registry, and local dependency info

2026-02-06 - 1.11.0 - feat(docker)

start temporary local registry for buildx dependency resolution and ensure buildx builder uses host network

2026-02-06 - 1.10.0 - feat(classes.dockerfile)

support using a local base image as a build context in buildx commands

2026-02-06 - 1.9.0 - feat(build)

add verbose build output, progress logging, and timing for builds/tests

2026-02-06 - 1.8.0 - feat(build)

add optional content-hash based build cache to skip rebuilding unchanged Dockerfiles

2026-02-06 - 1.7.0 - feat(cli)

add CLI version display using commitinfo

2026-02-06 - 1.6.0 - feat(docker)

add support for no-cache builds and tag built images for local dependency resolution

2026-02-06 - 1.5.0 - feat(build)

add support for selective builds, platform override and build timeout

2026-02-04 - 1.4.3 - fix(dockerfile)

fix matching of base images to local Dockerfiles by stripping registry prefixes when comparing image references

2026-01-21 - 1.4.2 - fix(classes.dockerfile)

use a single top-level fs import instead of requiring fs inside methods

2026-01-20 - 1.4.1 - fix(docs)

update README: expand usage, installation, quick start, features, troubleshooting and migration notes

2026-01-20 - 1.4.0 - feat(tsdocker)

add multi-registry and multi-arch Docker build/push/pull manager, registry storage, Dockerfile handling, and new CLI commands

2026-01-19 - 1.3.0 - feat(packaging)

Rename package scope to @git.zone and migrate to ESM; rename CLI/config keys, update entrypoints and imports, bump Node requirement to 18, and adjust scripts/dependencies

2025-12-13 - 1.2.43 - fix(packaging)

Rename package scope to @git.zone and migrate deps/CI; pin pnpm and enable ESM packaging

2025-11-22 - 1.2.42 - fix(package.json)

Add packageManager field to package.json to pin pnpm version

2025-11-22 - 1.2.41 - fix(core)

Migrate to @git.zone / @push.rocks packages, replace smartfile with smartfs and adapt filesystem usage; update dev deps and remove CI/lint config

2021-09-30 - 1.2.40 - release (no code changes)

Routine release tag with no recorded source changes.

2021-09-30 - 1.2.39 - fix(core)

Core maintenance updates.

2019-05-28 - 1.2.38 - fix(core)

Core maintenance updates.

2019-05-27 - 1.2.37 - fix(core)

Core maintenance updates.

2019-05-27 - 1.2.36 - fix(core)

Core maintenance updates.

2019-05-21 - 1.2.35 - fix(core)

Core maintenance updates.

2019-05-21 - 1.2.34 - fix(core)

Core maintenance updates.

2019-05-12 - 1.2.33 - fix(core)

Core maintenance updates.

2019-05-12 - 1.2.32 - fix(core)

Core maintenance updates.

2019-05-12 - 1.2.31 - fix(bin name)

Rename of the published CLI binary.

2019-05-10 - 1.2.30 - fix(core)

Core maintenance updates.

2019-05-10 - 1.2.29 - fix(core)

Core maintenance updates.

2019-05-10 - 1.2.28 - fix(core)

Core maintenance updates.

2019-05-09 - 1.2.27 - fix(core)

Core maintenance updates.

2018-10-29 - 1.2.26 - fix(ci)

CI build process change.

2018-10-29 - 1.2.25 - fix(core)

Core maintenance updates.

2018-10-28 - 1.2.24 - fix(clean)

Improved image cleanup.

2018-09-16 - 1.2.23 - fix(core)

Core maintenance updates.

2018-09-16 - 1.2.22 - fix(dependencies)

Dependency updates.

2018-07-21 - 1.2.21 - fix(update to latest standards)

Standards/update alignment.

2018-05-18 - 1.2.20 - release (no code changes)

Tagged release with no recorded source changes.

2018-05-18 - 1.2.19 - fix(ci)

CI improvements.

2018-05-18 - 1.2.18 - fix(package)

Packaging change for scoped publish.

2018-01-24 - 1.2.18 - update

Documentation update.

2017-10-13 - 1.2.17 - fix(cleanup)

Cleanup behavior fix.

2017-10-13 - 1.2.16 - update

Miscellaneous updates.

2017-10-13 - 1.2.15 - fix(test)

Testing improvements.

2017-10-07 - 1.2.14 - ci

CI improvements.

2017-10-07 - 1.2.13 - update(analytics)

Analytics integration.

2017-10-07 - 1.2.12 - update(dependencies)

Dependency updates.

2017-07-16 - 1.2.11 - update

Dependency and greeting update.

2017-04-21 - 1.2.10 - feature

Added analytics.

2017-04-02 - 1.2.8 - docs & ci

Docs and CI updates.

2017-04-02 - 1.2.7 - fix(command)

Command execution fix.

2017-03-28 - 1.2.6 - ci

CI configuration update.

2017-03-28 - 1.2.5 - ci

CI improvements.

2017-03-28 - 1.2.4 - perf

Performance improvements.

2017-02-12 - 1.2.3 - feature

New cleanup and diagnostics features.

2017-02-11 - 1.2.2 - feature

Cleanup enhancement.

2017-02-11 - 1.2.1 - maintenance

Docs and dependency updates.

2016-08-04 - 1.2.0 - maintenance

Dependency cleanup.

2016-07-29 - 1.1.6 - feature

Environment support.

2016-07-29 - 1.1.5 - fix

Container cleanup improvements.

2016-07-29 - 1.1.4 - fix

Namespace conflict avoidance.

2016-07-29 - 1.1.3 - ci

CI image configuration.

2016-07-29 - 1.1.2 - ci

CI fixes.

2016-07-28 - 1.1.1 - ci

CI fixes and configuration.

2016-07-28 - 1.1.0 - feature

Docker-in-Docker support.

2016-07-28 - 1.0.5 - feature & ci

Docker socket option and CI update.

2016-07-19 - 1.0.4 - release (no code changes)

Tagged release with no recorded source changes.

2016-07-19 - 1.0.3 - feature

Environment tagging.

2016-07-19 - 1.0.2 - milestone

CLI and stability improvements.

2016-07-19 - 1.0.1 - initial improvements

Early project refinements and Docker integration.

2016-07-13 - 1.0.0 - initial

Initial release.