diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 200c556..0000000 --- a/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM clickhouse/clickhouse-server - -# Install Node.js and ClickHouse -RUN apt-get update \ - && apt-get install -y curl gnupg2 \ - && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \ - && apt-get update \ - && apt-get install -y nodejs - -# Verify Node.js and npm installation -RUN node -v && npm -v diff --git a/Dockerfile_caddy b/Dockerfile_caddy new file mode 100644 index 0000000..0a64a15 --- /dev/null +++ b/Dockerfile_caddy @@ -0,0 +1,8 @@ +FROM caddy:latest +LABEL author="Task Venture Capital GmbH " + +# Caddy uses Alpine base, install Deno from Alpine edge +RUN apk add --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community deno + +# Verify Deno installation +RUN deno --version diff --git a/Dockerfile_caddy_alpine b/Dockerfile_caddy_alpine new file mode 100644 index 0000000..20e5e58 --- /dev/null +++ b/Dockerfile_caddy_alpine @@ -0,0 +1,59 @@ +FROM alpine:edge +LABEL author="Task Venture Capital GmbH " + +WORKDIR /workspace + +# Environment variables for NVM and Node.js +ENV NODE_VERSION_LTS="20.18.2" \ + NVM_DIR="/usr/local/nvm" \ + NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release" + +# Install required packages including Caddy and Deno +RUN apk add --no-cache \ + bash \ + curl \ + git \ + ca-certificates \ + unzip \ + libstdc++ \ + deno \ + caddy + +# Create Caddy directories +RUN mkdir -p /etc/caddy /data /config + +# Install NVM (latest version for better Alpine/musl support) +RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash + +# Make nvm available globally in all bash shells (interactive + non-interactive) +RUN printf '%s\n%s\n%s\n' \ + 'export NVM_DIR="/usr/local/nvm"' \ + '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \ + '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \ + > /etc/bash.bashrc + +# Copy nvm wrapper scripts +COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm +COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh + +# Use wrapper for RUN commands to enable nvm +SHELL ["/usr/local/bin/bash-with-nvm"] + +# Enable nvm for runtime bash commands (CI/CD workflows) +ENV BASH_ENV=/etc/bash.bashrc + +# Install Node.js LTS via NVM +RUN nvm install $NODE_VERSION_LTS \ + && nvm alias default $NODE_VERSION_LTS \ + && nvm use default + +ENV PATH="$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH" +ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules + +# Expose Caddy ports +EXPOSE 80 443 2019 + +# Set entrypoint to make nvm available in all runtime contexts +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"] diff --git a/Dockerfile_clickhouse b/Dockerfile_clickhouse new file mode 100644 index 0000000..06f465d --- /dev/null +++ b/Dockerfile_clickhouse @@ -0,0 +1,15 @@ +FROM clickhouse/clickhouse-server +LABEL author="Task Venture Capital GmbH " + +# Install Deno runtime for scripting/automation +RUN apt-get update \ + && apt-get install -y curl unzip ca-certificates \ + && curl -fsSL https://deno.land/install.sh | sh \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ENV DENO_INSTALL="/root/.deno" +ENV PATH="$DENO_INSTALL/bin:$PATH" + +# Verify Deno installation +RUN deno --version diff --git a/Dockerfile_clickhouse_alpine b/Dockerfile_clickhouse_alpine new file mode 100644 index 0000000..f89f8b7 --- /dev/null +++ b/Dockerfile_clickhouse_alpine @@ -0,0 +1,53 @@ +FROM alpine:edge +LABEL author="Task Venture Capital GmbH " + +WORKDIR /workspace + +# Environment variables for NVM and Node.js +ENV NODE_VERSION_LTS="20.18.2" \ + NVM_DIR="/usr/local/nvm" \ + NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release" + +# Install required packages including ClickHouse and Deno +RUN apk add --no-cache \ + bash \ + curl \ + git \ + ca-certificates \ + unzip \ + libstdc++ \ + deno \ + clickhouse + +# Install NVM (latest version for better Alpine/musl support) +RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash + +# Make nvm available globally in all bash shells (interactive + non-interactive) +RUN printf '%s\n%s\n%s\n' \ + 'export NVM_DIR="/usr/local/nvm"' \ + '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \ + '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \ + > /etc/bash.bashrc + +# Copy nvm wrapper scripts +COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm +COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh + +# Use wrapper for RUN commands to enable nvm +SHELL ["/usr/local/bin/bash-with-nvm"] + +# Enable nvm for runtime bash commands (CI/CD workflows) +ENV BASH_ENV=/etc/bash.bashrc + +# Install Node.js LTS via NVM +RUN nvm install $NODE_VERSION_LTS \ + && nvm alias default $NODE_VERSION_LTS \ + && nvm use default + +ENV PATH="$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH" +ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules + +# Set entrypoint to make nvm available in all runtime contexts +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["clickhouse-server"] diff --git a/Dockerfile_minio b/Dockerfile_minio new file mode 100644 index 0000000..bd35b6a --- /dev/null +++ b/Dockerfile_minio @@ -0,0 +1,17 @@ +FROM minio/minio:latest +LABEL author="Task Venture Capital GmbH " + +USER root + +# MinIO uses a minimal base, install required packages +RUN microdnf install -y curl unzip ca-certificates \ + && curl -fsSL https://deno.land/install.sh | sh \ + && microdnf clean all + +ENV DENO_INSTALL="/root/.deno" +ENV PATH="$DENO_INSTALL/bin:$PATH" + +# Verify Deno installation +RUN deno --version + +USER minio diff --git a/Dockerfile_minio_alpine b/Dockerfile_minio_alpine new file mode 100644 index 0000000..ecce567 --- /dev/null +++ b/Dockerfile_minio_alpine @@ -0,0 +1,56 @@ +FROM alpine:edge +LABEL author="Task Venture Capital GmbH " + +WORKDIR /workspace + +# Environment variables for NVM and Node.js +ENV NODE_VERSION_LTS="20.18.2" \ + NVM_DIR="/usr/local/nvm" \ + NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release" + +# Install required packages including MinIO and Deno +RUN apk add --no-cache \ + bash \ + curl \ + git \ + ca-certificates \ + unzip \ + libstdc++ \ + deno \ + minio + +# Create MinIO data directory +RUN mkdir -p /data && chmod 777 /data + +# Install NVM (latest version for better Alpine/musl support) +RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash + +# Make nvm available globally in all bash shells (interactive + non-interactive) +RUN printf '%s\n%s\n%s\n' \ + 'export NVM_DIR="/usr/local/nvm"' \ + '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \ + '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \ + > /etc/bash.bashrc + +# Copy nvm wrapper scripts +COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm +COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh + +# Use wrapper for RUN commands to enable nvm +SHELL ["/usr/local/bin/bash-with-nvm"] + +# Enable nvm for runtime bash commands (CI/CD workflows) +ENV BASH_ENV=/etc/bash.bashrc + +# Install Node.js LTS via NVM +RUN nvm install $NODE_VERSION_LTS \ + && nvm alias default $NODE_VERSION_LTS \ + && nvm use default + +ENV PATH="$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH" +ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules + +# Set entrypoint to make nvm available in all runtime contexts +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["minio", "server", "/data"] diff --git a/Dockerfile_mongodb b/Dockerfile_mongodb new file mode 100644 index 0000000..eed4cbe --- /dev/null +++ b/Dockerfile_mongodb @@ -0,0 +1,15 @@ +FROM mongo:latest +LABEL author="Task Venture Capital GmbH " + +# Install Deno runtime for scripting/automation +RUN apt-get update \ + && apt-get install -y curl unzip ca-certificates \ + && curl -fsSL https://deno.land/install.sh | sh \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ENV DENO_INSTALL="/root/.deno" +ENV PATH="$DENO_INSTALL/bin:$PATH" + +# Verify Deno installation +RUN deno --version diff --git a/Dockerfile_mongodb_alpine b/Dockerfile_mongodb_alpine new file mode 100644 index 0000000..514656d --- /dev/null +++ b/Dockerfile_mongodb_alpine @@ -0,0 +1,57 @@ +FROM alpine:edge +LABEL author="Task Venture Capital GmbH " + +WORKDIR /workspace + +# Environment variables for NVM and Node.js +ENV NODE_VERSION_LTS="20.18.2" \ + NVM_DIR="/usr/local/nvm" \ + NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release" + +# Install required packages including MongoDB and Deno +RUN apk add --no-cache \ + bash \ + curl \ + git \ + ca-certificates \ + unzip \ + libstdc++ \ + deno \ + mongodb \ + mongodb-tools + +# Create MongoDB data directory +RUN mkdir -p /data/db && chmod 777 /data/db + +# Install NVM (latest version for better Alpine/musl support) +RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash + +# Make nvm available globally in all bash shells (interactive + non-interactive) +RUN printf '%s\n%s\n%s\n' \ + 'export NVM_DIR="/usr/local/nvm"' \ + '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \ + '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \ + > /etc/bash.bashrc + +# Copy nvm wrapper scripts +COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm +COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh + +# Use wrapper for RUN commands to enable nvm +SHELL ["/usr/local/bin/bash-with-nvm"] + +# Enable nvm for runtime bash commands (CI/CD workflows) +ENV BASH_ENV=/etc/bash.bashrc + +# Install Node.js LTS via NVM +RUN nvm install $NODE_VERSION_LTS \ + && nvm alias default $NODE_VERSION_LTS \ + && nvm use default + +ENV PATH="$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH" +ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules + +# Set entrypoint to make nvm available in all runtime contexts +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["mongod"] diff --git a/Dockerfile_redis b/Dockerfile_redis new file mode 100644 index 0000000..7618c6d --- /dev/null +++ b/Dockerfile_redis @@ -0,0 +1,15 @@ +FROM redis:latest +LABEL author="Task Venture Capital GmbH " + +# Install Deno runtime for scripting/automation +RUN apt-get update \ + && apt-get install -y curl unzip ca-certificates \ + && curl -fsSL https://deno.land/install.sh | sh \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ENV DENO_INSTALL="/root/.deno" +ENV PATH="$DENO_INSTALL/bin:$PATH" + +# Verify Deno installation +RUN deno --version diff --git a/Dockerfile_redis_alpine b/Dockerfile_redis_alpine new file mode 100644 index 0000000..34df28a --- /dev/null +++ b/Dockerfile_redis_alpine @@ -0,0 +1,59 @@ +FROM alpine:edge +LABEL author="Task Venture Capital GmbH " + +WORKDIR /workspace + +# Environment variables for NVM and Node.js +ENV NODE_VERSION_LTS="20.18.2" \ + NVM_DIR="/usr/local/nvm" \ + NVM_NODEJS_ORG_MIRROR="https://unofficial-builds.nodejs.org/download/release" + +# Install required packages including Redis and Deno +RUN apk add --no-cache \ + bash \ + curl \ + git \ + ca-certificates \ + unzip \ + libstdc++ \ + deno \ + redis + +# Create Redis data directory +RUN mkdir -p /data && chmod 777 /data + +# Install NVM (latest version for better Alpine/musl support) +RUN mkdir -p $NVM_DIR && curl https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash + +# Make nvm available globally in all bash shells (interactive + non-interactive) +RUN printf '%s\n%s\n%s\n' \ + 'export NVM_DIR="/usr/local/nvm"' \ + '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' \ + '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"' \ + > /etc/bash.bashrc + +# Copy nvm wrapper scripts +COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm +COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh + +# Use wrapper for RUN commands to enable nvm +SHELL ["/usr/local/bin/bash-with-nvm"] + +# Enable nvm for runtime bash commands (CI/CD workflows) +ENV BASH_ENV=/etc/bash.bashrc + +# Install Node.js LTS via NVM +RUN nvm install $NODE_VERSION_LTS \ + && nvm alias default $NODE_VERSION_LTS \ + && nvm use default + +ENV PATH="$NVM_DIR/versions/node/v$NODE_VERSION_LTS/bin:$PATH" +ENV NODE_PATH=$NVM_DIR/v$NODE_VERSION_LTS/lib/node_modules + +# Expose Redis port +EXPOSE 6379 + +# Set entrypoint to make nvm available in all runtime contexts +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +CMD ["redis-server"] diff --git a/build-images.sh b/build-images.sh new file mode 100644 index 0000000..0f1b831 --- /dev/null +++ b/build-images.sh @@ -0,0 +1,130 @@ +#!/bin/bash +set -e + +echo "Building ht-docker-tools Images" +echo "================================" +echo "" + +# Color codes +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +# Check if buildx is available +if ! docker buildx version &> /dev/null; then + echo -e "${YELLOW}Warning: docker buildx not found. Installing...${NC}" + docker buildx create --use +fi + +# Ensure buildx builder is running +echo -e "${BLUE}Setting up buildx builder...${NC}" +if ! docker buildx inspect default-builder &> /dev/null; then + docker buildx create --name default-builder --use +else + docker buildx use default-builder +fi +echo -e "${GREEN}Buildx ready${NC}" +echo "" + +# Build function for single platform (for local testing) +build_native_image() { + local dockerfile=$1 + local tag=$2 + local description=$3 + local platform=$(uname -m) + + # Convert platform name + if [ "$platform" = "x86_64" ]; then + platform="linux/amd64" + elif [ "$platform" = "aarch64" ] || [ "$platform" = "arm64" ]; then + platform="linux/arm64" + fi + + echo -e "${BLUE}Building: ${NC}${description}" + echo -e "${YELLOW} Dockerfile: ${NC}${dockerfile}" + echo -e "${YELLOW} Tag: ${NC}${tag}" + echo -e "${YELLOW} Platform: ${NC}${platform} (native)" + + if docker buildx build \ + --platform "${platform}" \ + -f "${dockerfile}" \ + -t "${tag}" \ + --load \ + .; then + echo -e "${GREEN}Success: ${NC}${tag} (${platform})" + echo "" + else + echo -e "${RED}Failed: ${NC}${tag}" + exit 1 + fi +} + +echo -e "${BLUE}======================================${NC}" +echo -e "${BLUE}Building Official Base Images${NC}" +echo -e "${BLUE}======================================${NC}" +echo "" +echo -e "${YELLOW}Note: Building for native platform only (for local testing)${NC}" +echo -e "${YELLOW}For multi-arch builds, use: docker buildx build --platform linux/amd64,linux/arm64 --push ...${NC}" +echo "" + +# Official base images +build_native_image "Dockerfile_clickhouse" \ + "ht-docker-tools:clickhouse" \ + "ClickHouse (official base) + Deno" + +build_native_image "Dockerfile_mongodb" \ + "ht-docker-tools:mongodb" \ + "MongoDB (official base) + Deno" + +build_native_image "Dockerfile_minio" \ + "ht-docker-tools:minio" \ + "MinIO (official base) + Deno" + +build_native_image "Dockerfile_caddy" \ + "ht-docker-tools:caddy" \ + "Caddy (official base) + Deno" + +build_native_image "Dockerfile_redis" \ + "ht-docker-tools:redis" \ + "Redis (official base) + Deno" + +echo -e "${BLUE}======================================${NC}" +echo -e "${BLUE}Building Alpine Images${NC}" +echo -e "${BLUE}======================================${NC}" +echo "" + +# Alpine images +build_native_image "Dockerfile_clickhouse_alpine" \ + "ht-docker-tools:clickhouse-alpine" \ + "ClickHouse Alpine + NVM + Deno" + +build_native_image "Dockerfile_mongodb_alpine" \ + "ht-docker-tools:mongodb-alpine" \ + "MongoDB Alpine + NVM + Deno" + +build_native_image "Dockerfile_minio_alpine" \ + "ht-docker-tools:minio-alpine" \ + "MinIO Alpine + NVM + Deno" + +build_native_image "Dockerfile_caddy_alpine" \ + "ht-docker-tools:caddy-alpine" \ + "Caddy Alpine + NVM + Deno" + +build_native_image "Dockerfile_redis_alpine" \ + "ht-docker-tools:redis-alpine" \ + "Redis Alpine + NVM + Deno" + +# Summary +echo -e "${GREEN}======================================${NC}" +echo -e "${GREEN}All Images Built Successfully!${NC}" +echo -e "${GREEN}======================================${NC}" +echo "" +echo "Built Images:" +echo "" +docker images | grep "ht-docker-tools:" | awk '{printf " %-40s %10s\n", $1":"$2, $7" "$8}' +echo "" +echo -e "${YELLOW}These images are built for your native architecture for local testing.${NC}" +echo -e "${YELLOW}In CI/CD, build with: docker buildx build --platform linux/amd64,linux/arm64 --push${NC}" +echo "" diff --git a/image_support_files/README.md b/image_support_files/README.md new file mode 100644 index 0000000..aefcb6a --- /dev/null +++ b/image_support_files/README.md @@ -0,0 +1,52 @@ +# Image Support Files + +This directory contains helper scripts that enable NVM (Node Version Manager) functionality in Docker images. + +## Files + +### bash-with-nvm + +A wrapper script used as the SHELL directive in Dockerfiles. It loads NVM before executing any RUN command, enabling commands like: + +```dockerfile +SHELL ["/usr/local/bin/bash-with-nvm"] +RUN nvm install 18 +RUN node --version +``` + +### docker-entrypoint.sh + +An entrypoint script that ensures NVM is available at runtime. It handles: + +1. Loading NVM environment on container start +2. Special handling for `bash -c` commands (common in CI/CD) to inject bashrc sourcing + +## Usage + +These files are copied into Alpine-based Docker images: + +```dockerfile +COPY image_support_files/bash-with-nvm /usr/local/bin/bash-with-nvm +COPY image_support_files/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh +RUN chmod +x /usr/local/bin/bash-with-nvm /usr/local/bin/docker-entrypoint.sh + +SHELL ["/usr/local/bin/bash-with-nvm"] +ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] +``` + +## Why These Scripts Are Needed + +NVM is a bash function, not a binary. This creates challenges in Docker: + +1. **Build time**: Each RUN command starts a fresh shell without NVM loaded +2. **Runtime**: Container commands don't automatically have NVM available +3. **CI/CD**: Non-interactive shells (bash -c) need special handling + +These scripts solve all three contexts. + +## Maintenance + +When updating NVM version, ensure compatibility with both scripts. The NVM_DIR path (`/usr/local/nvm`) must match across: +- These scripts +- Dockerfile ENV declarations +- /etc/bash.bashrc configuration diff --git a/image_support_files/bash-with-nvm b/image_support_files/bash-with-nvm new file mode 100644 index 0000000..49280ab --- /dev/null +++ b/image_support_files/bash-with-nvm @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +# Load nvm before executing Dockerfile RUN commands +export NVM_DIR="/usr/local/nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + +# Execute the command passed to this wrapper +eval "$@" diff --git a/image_support_files/docker-entrypoint.sh b/image_support_files/docker-entrypoint.sh new file mode 100644 index 0000000..191aa5d --- /dev/null +++ b/image_support_files/docker-entrypoint.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +# Load nvm in the entrypoint environment +export NVM_DIR="/usr/local/nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" + +# If command is bash -c, inject bashrc sourcing to make nvm available +if [ "$1" = "bash" ] && [ "$2" = "-c" ]; then + shift 2 + exec bash -c "source /etc/bash.bashrc && $*" +else + exec "$@" +fi diff --git a/package.json b/package.json index a9067a6..406f2e5 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,23 @@ { - "name": "ht-docker-clickhouse", + "name": "ht-docker-tools", "private": true, - "version": "1.0.17", - "description": "chrome for docker", + "version": "2.0.0", + "description": "Docker images for various tools (MongoDB, MinIO, ClickHouse, Caddy, Redis) with Deno runtime", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\"", - "testBuild": "docker build -t yandex . && docker rmi yandex", - "build": "echo 'not needed.'" + "build": "echo 'not needed.'", + "build:images": "chmod +x build-images.sh && ./build-images.sh", + "test:images": "chmod +x test-images.sh && ./test-images.sh" }, "repository": { "type": "git", - "url": "git+ssh://git@gitlab.com/hosttoday/ht-docker-clickhouse.git" + "url": "git+ssh://git@code.foss.global/host.today/ht-docker-tools.git" }, - "author": "", + "author": "Task Venture Capital GmbH ", "license": "MIT", "bugs": { - "url": "https://gitlab.com/hosttoday/ht-docker-clickhouse/issues" + "url": "https://code.foss.global/host.today/ht-docker-tools/issues" }, - "homepage": "https://gitlab.com/hosttoday/ht-docker-clickhouse#README" + "homepage": "https://code.foss.global/host.today/ht-docker-tools#readme" } diff --git a/readme.hints.md b/readme.hints.md index 0519ecb..bf9a097 100644 --- a/readme.hints.md +++ b/readme.hints.md @@ -1 +1,108 @@ - \ No newline at end of file +# Technical Notes - ht-docker-tools + +## Architecture Overview + +This repository provides Docker images in two variants: + +1. **Official Base Images**: Extend official images with Deno runtime +2. **Alpine Images**: Standalone Alpine-based with full NVM + Node.js + Deno stack + +## NVM Implementation (Alpine Images) + +NVM is a bash function, not a binary. This creates challenges in Docker contexts: + +### Three Context Solutions + +1. **Build-time (Dockerfile RUN commands)** + - Uses `bash-with-nvm` wrapper script as SHELL directive + - Loads NVM before executing each RUN command + +2. **Runtime (CI/CD bash -c commands)** + - `docker-entrypoint.sh` handles `bash -c` commands + - Injects bashrc sourcing automatically + - `ENV BASH_ENV=/etc/bash.bashrc` enables non-interactive shell support + +3. **Interactive shells** + - `/etc/bash.bashrc` configured with NVM initialization + - Works in interactive terminal sessions + +### Key Files + +- `image_support_files/bash-with-nvm` - Build-time NVM wrapper +- `image_support_files/docker-entrypoint.sh` - Runtime NVM support +- `/etc/bash.bashrc` - Created during build with NVM init + +## Official Base Image Considerations + +### ClickHouse (Debian-based) +- Base: `clickhouse/clickhouse-server` +- Deno installed via curl installer +- Preserves original entrypoint + +### MongoDB (Debian-based) +- Base: `mongo:latest` +- Deno installed via curl installer +- Preserves original entrypoint + +### MinIO (RHEL-based minimal) +- Base: `minio/minio:latest` +- Uses `microdnf` for package management +- Requires USER switch (root for install, minio for runtime) + +### Caddy (Alpine-based) +- Base: `caddy:latest` +- Deno installed from Alpine edge repository +- Already Alpine, so minimal modification needed + +### Redis (Debian-based) +- Base: `redis:latest` +- Deno installed via curl installer +- Preserves original entrypoint + +## Alpine Package Availability + +| Tool | Package | Repository | +|------|---------|------------| +| MongoDB | `mongodb`, `mongodb-tools` | edge/community | +| MinIO | `minio` | edge/community | +| ClickHouse | `clickhouse` | edge/community | +| Caddy | `caddy` | edge/community | +| Redis | `redis` | main | +| Deno | `deno` | edge/community | + +All Alpine images use `alpine:edge` to access community packages. + +## Version Information + +- NVM: v0.40.1 +- Node.js LTS: 20.18.2 +- Uses unofficial-builds.nodejs.org for musl (Alpine) compatibility + +## Multi-Architecture + +Alpine images support: +- `linux/amd64` (x86_64) +- `linux/arm64` (aarch64/Apple Silicon) + +Build with buildx: +```bash +docker buildx build --platform linux/amd64,linux/arm64 -f Dockerfile_xxx --push . +``` + +## CI/CD Integration + +The images work with npmci for automated building: +```bash +npmci docker login +npmci docker build +npmci docker test +npmci docker push code.foss.global +``` + +## Testing + +Run the test script to verify: +- Deno availability in all images +- NVM availability in Alpine images +- Node.js version in Alpine images +- NVM version switching capability diff --git a/readme.md b/readme.md index e69de29..b0dff97 100644 --- a/readme.md +++ b/readme.md @@ -0,0 +1,183 @@ +# ht-docker-tools + +Docker images for various tools (MongoDB, MinIO, ClickHouse, Caddy, Redis) enhanced with Deno runtime support. + +## Available Images + +### Official Base Images + +These images extend official Docker images with Deno runtime: + +| Image | Base | Description | +|-------|------|-------------| +| `ht-docker-tools:clickhouse` | clickhouse/clickhouse-server | ClickHouse + Deno | +| `ht-docker-tools:mongodb` | mongo:latest | MongoDB + Deno | +| `ht-docker-tools:minio` | minio/minio:latest | MinIO + Deno | +| `ht-docker-tools:caddy` | caddy:latest | Caddy + Deno | +| `ht-docker-tools:redis` | redis:latest | Redis + Deno | + +### Alpine Images + +Lightweight Alpine-based images with full NVM + Node.js + Deno support: + +| Image | Description | Size | +|-------|-------------|------| +| `ht-docker-tools:clickhouse-alpine` | ClickHouse + NVM + Node.js + Deno | ~250MB | +| `ht-docker-tools:mongodb-alpine` | MongoDB + NVM + Node.js + Deno | ~200MB | +| `ht-docker-tools:minio-alpine` | MinIO + NVM + Node.js + Deno | ~200MB | +| `ht-docker-tools:caddy-alpine` | Caddy + NVM + Node.js + Deno | ~200MB | +| `ht-docker-tools:redis-alpine` | Redis + NVM + Node.js + Deno | ~200MB | + +## Quick Start + +### Using Official Base Images + +```bash +# MongoDB with Deno scripting +docker run -d --name mongo ht-docker-tools:mongodb + +# Execute Deno script inside container +docker exec mongo deno run --allow-net script.ts + +# Redis with Deno +docker run -d --name redis ht-docker-tools:redis +``` + +### Using Alpine Images + +```bash +# MongoDB Alpine with Node.js and Deno +docker run -d --name mongo-alpine ht-docker-tools:mongodb-alpine + +# Use Node.js +docker exec mongo-alpine bash -c "node --version" + +# Use Deno +docker exec mongo-alpine bash -c "deno --version" + +# Switch Node versions with NVM +docker exec mongo-alpine bash -c "nvm install 18 && nvm use 18 && node --version" +``` + +## Features + +### Official Base Images +- Extend official Docker images (MongoDB, MinIO, ClickHouse, Caddy, Redis) +- Add Deno runtime for scripting and automation +- Preserve original image entrypoints and configurations +- Ideal for production use with existing configurations + +### Alpine Images +- Lightweight Alpine-based (significantly smaller than official images) +- Full NVM support for Node.js version switching +- Node.js LTS (20.18.2) pre-installed +- Deno runtime included +- Multi-architecture support (amd64/arm64) +- Ideal for CI/CD and development environments + +## Docker Compose Example + +```yaml +version: '3.8' + +services: + mongodb: + image: code.foss.global/host.today/ht-docker-tools:mongodb-alpine + ports: + - "27017:27017" + volumes: + - mongodb_data:/data/db + command: mongod + + redis: + image: code.foss.global/host.today/ht-docker-tools:redis-alpine + ports: + - "6379:6379" + volumes: + - redis_data:/data + command: redis-server + + minio: + image: code.foss.global/host.today/ht-docker-tools:minio-alpine + ports: + - "9000:9000" + - "9001:9001" + environment: + MINIO_ROOT_USER: minioadmin + MINIO_ROOT_PASSWORD: minioadmin + volumes: + - minio_data:/data + command: minio server /data --console-address ":9001" + + caddy: + image: code.foss.global/host.today/ht-docker-tools:caddy-alpine + ports: + - "80:80" + - "443:443" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - caddy_data:/data + - caddy_config:/config + +volumes: + mongodb_data: + redis_data: + minio_data: + caddy_data: + caddy_config: +``` + +## Building Images Locally + +```bash +# Clone the repository +git clone https://code.foss.global/host.today/ht-docker-tools.git +cd ht-docker-tools + +# Build all images +chmod +x build-images.sh +./build-images.sh + +# Test all images +chmod +x test-images.sh +./test-images.sh +``` + +## Multi-Architecture Support + +All Alpine images support both `linux/amd64` and `linux/arm64` architectures. + +For CI/CD multi-arch builds: + +```bash +docker buildx build \ + --platform linux/amd64,linux/arm64 \ + -f Dockerfile_mongodb_alpine \ + -t code.foss.global/host.today/ht-docker-tools:mongodb-alpine \ + --push . +``` + +## NVM Usage (Alpine Images) + +Alpine images include NVM for Node.js version management: + +```bash +# Check NVM version +docker run --rm ht-docker-tools:redis-alpine bash -c "nvm --version" + +# Install specific Node.js version +docker run --rm ht-docker-tools:redis-alpine bash -c "nvm install 18 && node --version" + +# Use in Dockerfile +FROM code.foss.global/host.today/ht-docker-tools:mongodb-alpine +RUN nvm install 18 && nvm use 18 && npm install -g typescript +``` + +## Registry + +Images are available at: +- `code.foss.global/host.today/ht-docker-tools` + +## License + +MIT - Task Venture Capital GmbH diff --git a/test-images.sh b/test-images.sh new file mode 100644 index 0000000..27978d4 --- /dev/null +++ b/test-images.sh @@ -0,0 +1,146 @@ +#!/bin/bash +set -e + +echo "Testing ht-docker-tools Images" +echo "==============================" +echo "" + +# Color codes +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' # No Color + +FAILED_TESTS=0 + +# Test function +test_image() { + local tag=$1 + local description=$2 + local command=$3 + + echo -e "${BLUE}Testing: ${NC}${description}" + echo -e "${YELLOW} Image: ${NC}${tag}" + echo -e "${YELLOW} Command: ${NC}${command}" + + if output=$(docker run --rm "${tag}" bash -c "${command}" 2>&1); then + echo -e "${GREEN} Result: ${NC}${output}" + echo -e "${GREEN} PASSED${NC}" + else + echo -e "${RED} FAILED: ${NC}${output}" + ((FAILED_TESTS++)) + fi + echo "" +} + +echo -e "${BLUE}======================================${NC}" +echo -e "${BLUE}Testing Official Base Images${NC}" +echo -e "${BLUE}======================================${NC}" +echo "" + +# Test official base images (Deno only) +test_image "ht-docker-tools:clickhouse" \ + "ClickHouse + Deno" \ + "deno --version | head -1" + +test_image "ht-docker-tools:mongodb" \ + "MongoDB + Deno" \ + "deno --version | head -1" + +test_image "ht-docker-tools:minio" \ + "MinIO + Deno" \ + "deno --version | head -1" + +test_image "ht-docker-tools:caddy" \ + "Caddy + Deno" \ + "deno --version | head -1" + +test_image "ht-docker-tools:redis" \ + "Redis + Deno" \ + "deno --version | head -1" + +echo -e "${BLUE}======================================${NC}" +echo -e "${BLUE}Testing Alpine Images${NC}" +echo -e "${BLUE}======================================${NC}" +echo "" + +# Test Alpine images (NVM + Node.js + Deno + Service) +test_image "ht-docker-tools:clickhouse-alpine" \ + "ClickHouse Alpine - NVM" \ + "nvm --version" + +test_image "ht-docker-tools:clickhouse-alpine" \ + "ClickHouse Alpine - Node.js" \ + "node --version" + +test_image "ht-docker-tools:clickhouse-alpine" \ + "ClickHouse Alpine - Deno" \ + "deno --version | head -1" + +test_image "ht-docker-tools:mongodb-alpine" \ + "MongoDB Alpine - NVM" \ + "nvm --version" + +test_image "ht-docker-tools:mongodb-alpine" \ + "MongoDB Alpine - Node.js" \ + "node --version" + +test_image "ht-docker-tools:mongodb-alpine" \ + "MongoDB Alpine - Deno" \ + "deno --version | head -1" + +test_image "ht-docker-tools:minio-alpine" \ + "MinIO Alpine - NVM" \ + "nvm --version" + +test_image "ht-docker-tools:minio-alpine" \ + "MinIO Alpine - Node.js" \ + "node --version" + +test_image "ht-docker-tools:minio-alpine" \ + "MinIO Alpine - Deno" \ + "deno --version | head -1" + +test_image "ht-docker-tools:caddy-alpine" \ + "Caddy Alpine - NVM" \ + "nvm --version" + +test_image "ht-docker-tools:caddy-alpine" \ + "Caddy Alpine - Node.js" \ + "node --version" + +test_image "ht-docker-tools:caddy-alpine" \ + "Caddy Alpine - Deno" \ + "deno --version | head -1" + +test_image "ht-docker-tools:redis-alpine" \ + "Redis Alpine - NVM" \ + "nvm --version" + +test_image "ht-docker-tools:redis-alpine" \ + "Redis Alpine - Node.js" \ + "node --version" + +test_image "ht-docker-tools:redis-alpine" \ + "Redis Alpine - Deno" \ + "deno --version | head -1" + +echo -e "${BLUE}======================================${NC}" +echo -e "${BLUE}Testing NVM Version Switching${NC}" +echo -e "${BLUE}======================================${NC}" +echo "" + +test_image "ht-docker-tools:redis-alpine" \ + "NVM - Install Node 18" \ + "nvm install 18 && nvm use 18 && node --version" + +# Summary +echo -e "${BLUE}======================================${NC}" +if [ $FAILED_TESTS -eq 0 ]; then + echo -e "${GREEN}All tests passed!${NC}" +else + echo -e "${RED}${FAILED_TESTS} test(s) failed${NC}" + exit 1 +fi +echo -e "${BLUE}======================================${NC}"