# @git.zone/tsdocker > 🐳 The ultimate Docker development toolkit for TypeScript projects β€” build, test, and ship containerized applications with ease. ## Issue Reporting and Security For reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://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/](https://code.foss.global/) account to submit Pull Requests directly. ## What is tsdocker? **tsdocker** is a comprehensive Docker development and building tool that handles everything from testing npm packages in clean environments to building and pushing multi-architecture Docker images across multiple registries. ### 🎯 Key Capabilities - πŸ§ͺ **Containerized Testing** β€” Run your tests in pristine Docker environments - πŸ—οΈ **Smart Docker Builds** β€” Automatically discover, sort, and build Dockerfiles by dependency - πŸš€ **Multi-Registry Push** β€” Ship to Docker Hub, GitLab, GitHub Container Registry, and more - πŸ”§ **Multi-Architecture** β€” Build for `amd64` and `arm64` with Docker Buildx - ⚑ **Zero Config Start** β€” Works out of the box, scales with your needs ## Installation ```bash # 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 ### πŸ§ͺ Run Tests in Docker The simplest use case β€” run your tests in a clean container: ```bash tsdocker ``` This pulls your configured base image, mounts your project, and executes your test command in isolation. ### πŸ—οΈ Build Docker Images Got `Dockerfile` files? Build them all with automatic dependency ordering: ```bash 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 ### πŸ“€ Push to Registries Ship your images to one or all configured registries: ```bash # Push to all configured registries tsdocker push # Push to a specific registry tsdocker push registry.gitlab.com ``` ## CLI Commands | Command | Description | |---------|-------------| | `tsdocker` | Run tests in a fresh Docker container | | `tsdocker build` | Build all Dockerfiles with dependency ordering | | `tsdocker push [registry]` | Push images to configured registries | | `tsdocker pull ` | Pull images from a specific registry | | `tsdocker test` | Run container test scripts (test_*.sh) | | `tsdocker login` | Authenticate with configured registries | | `tsdocker list` | Display discovered Dockerfiles and their dependencies | | `tsdocker clean --all` | ⚠️ Aggressively clean Docker environment | | `tsdocker vscode` | Launch containerized VS Code in browser | ## Configuration Configure tsdocker in your `package.json` or `npmextra.json`: ```json { "@git.zone/tsdocker": { "baseImage": "node:20", "command": "npm test", "dockerSock": false, "registries": ["registry.gitlab.com", "docker.io"], "registryRepoMap": { "registry.gitlab.com": "myorg/myproject" }, "buildArgEnvMap": { "NODE_VERSION": "NODE_VERSION" }, "platforms": ["linux/amd64", "linux/arm64"], "push": false, "testDir": "./test" } } ``` ### Configuration Options #### Testing Options (Legacy) | Option | Type | Description | |--------|------|-------------| | `baseImage` | `string` | Docker image for test environment (default: `hosttoday/ht-docker-node:npmdocker`) | | `command` | `string` | Command to run inside container (default: `npmci npm test`) | | `dockerSock` | `boolean` | Mount Docker socket for DinD scenarios (default: `false`) | #### Build & Push Options | Option | Type | 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[]` | Target architectures (default: `["linux/amd64"]`) | | `push` | `boolean` | Auto-push after build (default: `false`) | | `testDir` | `string` | Directory containing test scripts | ## Registry Authentication ### Environment Variables ```bash # 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" ``` ### Login Command ```bash tsdocker login ``` Authenticates with all configured registries. ## Advanced Usage ### πŸ”€ Multi-Architecture Builds Build for multiple platforms using Docker Buildx: ```json { "@git.zone/tsdocker": { "platforms": ["linux/amd64", "linux/arm64"] } } ``` tsdocker automatically sets up a Buildx builder when multiple platforms are specified. ### πŸ“¦ 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 | ### πŸ”— Dependency-Aware Builds If you have multiple Dockerfiles that depend on each other: ```dockerfile # 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` and builds them in the correct order. ### πŸ§ͺ Container Test Scripts Create test scripts in your test directory: ```bash # test/test_latest.sh #!/bin/bash node --version npm --version echo "Container tests passed!" ``` Run with: ```bash tsdocker test ``` ### πŸ”§ Build Args from Environment Pass environment variables as Docker build arguments: ```json { "@git.zone/tsdocker": { "buildArgEnvMap": { "NPM_TOKEN": "NPM_TOKEN", "NODE_VERSION": "NODE_VERSION" } } } ``` ```dockerfile ARG NPM_TOKEN ARG NODE_VERSION=20 FROM node:${NODE_VERSION} RUN echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc ``` ### 🐳 Docker-in-Docker Testing Test Docker-related tools by mounting the Docker socket: ```json { "@git.zone/tsdocker": { "baseImage": "docker:latest", "command": "docker version && docker ps", "dockerSock": true } } ``` ### πŸ“‹ Listing Dockerfiles Inspect your project's Dockerfiles and their relationships: ```bash tsdocker list ``` Output: ``` Discovered Dockerfiles: ======================== 1. Dockerfile_base Tag: myproject:base Base Image: node:20-alpine Version: base 2. Dockerfile_app Tag: myproject:app Base Image: myproject:base Version: app Depends on: myproject:base ``` ### πŸ—ΊοΈ Registry Repo Mapping Use different repository names for different registries: ```json { "@git.zone/tsdocker": { "registries": ["registry.gitlab.com", "docker.io"], "registryRepoMap": { "registry.gitlab.com": "mygroup/myproject", "docker.io": "myuser/myproject" } } } ``` ## Environment Variables ### qenv Integration tsdocker automatically loads environment variables from `qenv.yml`: ```yaml # qenv.yml API_KEY: your-api-key DATABASE_URL: postgres://localhost/test ``` These are injected into your test container automatically. ## Examples ### Basic Test Configuration ```json { "@git.zone/tsdocker": { "baseImage": "node:20", "command": "npm test" } } ``` ### Full Production Setup ```json { "@git.zone/tsdocker": { "baseImage": "node:20-alpine", "command": "pnpm test", "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 ```yaml # .gitlab-ci.yml build: stage: build script: - npm install -g @git.zone/tsdocker - tsdocker build - tsdocker push # GitHub Actions - name: Build and Push run: | npm install -g @git.zone/tsdocker tsdocker login tsdocker build tsdocker push env: DOCKER_REGISTRY_1: "ghcr.io|${{ github.actor }}|${{ secrets.GITHUB_TOKEN }}" ``` ## Requirements - **Docker** β€” Docker Engine or Docker Desktop must be installed - **Node.js** β€” Version 18 or higher (ESM support required) - **Docker Buildx** β€” Required for multi-architecture builds (included in Docker Desktop) ## Why tsdocker? ### 🎯 The Problem Managing Docker workflows manually is tedious: - Remembering build order for dependent images - Pushing to multiple registries with different credentials - Setting up Buildx for multi-arch builds - Ensuring consistent test environments ### ✨ The Solution tsdocker automates the entire workflow: - **One command** to build all images in dependency order - **One command** to push to all registries - **Automatic** Buildx setup for multi-platform builds - **Consistent** containerized test environments ## TypeScript API tsdocker exposes its types for programmatic use: ```typescript import type { ITsDockerConfig } from '@git.zone/tsdocker/dist_ts/interfaces/index.js'; import { TsDockerManager } from '@git.zone/tsdocker/dist_ts/classes.tsdockermanager.js'; const config: ITsDockerConfig = { baseImage: 'node:20', command: 'npm test', dockerSock: false, keyValueObject: {}, registries: ['docker.io'], platforms: ['linux/amd64'], }; const manager = new TsDockerManager(config); await manager.prepare(); await manager.build(); await manager.push(); ``` ## Troubleshooting ### "docker not found" Ensure Docker is installed and in your PATH: ```bash docker --version ``` ### Multi-arch build fails Make sure Docker Buildx is available: ```bash docker buildx version docker buildx create --use ``` ### Registry authentication fails Check your environment variables are set correctly: ```bash echo $DOCKER_REGISTRY_1 tsdocker login ``` ### Circular dependency detected Review your Dockerfiles' `FROM` statements β€” you have images depending on each other in a loop. ## Performance Tips πŸš€ **Use specific tags**: `node:20-alpine` is smaller and faster than `node:latest` πŸš€ **Leverage caching**: Docker layers are cached β€” your builds get faster over time πŸš€ **Prune regularly**: `docker system prune` reclaims disk space πŸš€ **Use .dockerignore**: Exclude `node_modules`, `.git`, etc. from build context ## Migration from Legacy Previously published as `npmdocker`, now `@git.zone/tsdocker`: | Old | New | |-----|-----| | `npmdocker` command | `tsdocker` command | | `"npmdocker"` config key | `"@git.zone/tsdocker"` config key | | CommonJS | ESM with `.js` imports | ## License and Legal Information This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](./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 For any legal inquiries or further information, please contact us via email at hello@task.vc. 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.