fix image parsing and add docker build script
This commit is contained in:
parent
fe8f0a875a
commit
1a7ea2beb5
10
Dockerfile.rust-builder
Normal file
10
Dockerfile.rust-builder
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Pinned to Debian Bookworm so the compiled binary is compatible with the
|
||||||
|
# Debian Bookworm runtime image used by Dockerfile (GLIBC 2.36).
|
||||||
|
FROM rust:1-bookworm
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# lance-* generates protobuf bindings during compilation.
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends protobuf-compiler libprotobuf-dev \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
158
build-docker.sh
Normal file → Executable file
158
build-docker.sh
Normal file → Executable file
@ -1,62 +1,114 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
# Build HTKnow on a server without installing Node.js or Rust on the host.
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# ./build-docker.sh
|
||||||
|
# ./build-docker.sh --tag gwknow:v0.0.2
|
||||||
|
# ./build-docker.sh --skip-frontend --tag gwknow:v0.0.3
|
||||||
|
# IMAGE_TAG=v0.0.3 ./build-docker.sh
|
||||||
|
|
||||||
set -e
|
set -Eeuo pipefail
|
||||||
|
|
||||||
# Parse command line arguments
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
BUILD_MODE="release"
|
cd "$ROOT_DIR"
|
||||||
PROFILING_FLAG=""
|
|
||||||
CUSTOM_IMAGE_TAG="${IMAGE_TAG:-}"
|
NODE_IMAGE="${NODE_IMAGE:-docker.1ms.run/node:22}"
|
||||||
if [ "${1:-}" = "debug" ] || [ "${1:-}" = "--debug" ]; then
|
RUST_BUILDER_IMAGE="${RUST_BUILDER_IMAGE:-htknow-rust-builder:bookworm}"
|
||||||
BUILD_MODE="debug"
|
SKIP_FRONTEND=false
|
||||||
PROFILING_FLAG="--features profiling"
|
REBUILD_BUILDER=false
|
||||||
|
IMAGE_TAG="${IMAGE_TAG:-}"
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<'EOF'
|
||||||
|
Usage: ./build-docker.sh [options]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--tag IMAGE Target image tag, for example gwknow:v0.0.2.
|
||||||
|
--skip-frontend Do not rebuild frontend/dist (safe for Rust-only changes).
|
||||||
|
--rebuild-builder Rebuild the cached Rust + protoc builder image.
|
||||||
|
-h, --help Show this help.
|
||||||
|
|
||||||
|
Environment overrides:
|
||||||
|
IMAGE_TAG, NODE_IMAGE, RUST_BUILDER_IMAGE
|
||||||
|
|
||||||
|
If --tag and IMAGE_TAG are omitted, a new gwknow:YYYYmmdd-HHMMSS tag is used.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
--tag)
|
||||||
|
[[ $# -ge 2 ]] || { echo "--tag requires an image tag" >&2; exit 2; }
|
||||||
|
IMAGE_TAG="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--skip-frontend|--backend-only)
|
||||||
|
SKIP_FRONTEND=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--rebuild-builder)
|
||||||
|
REBUILD_BUILDER=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option: $1" >&2
|
||||||
|
usage >&2
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
command -v docker >/dev/null || { echo "docker is not installed or is not in PATH" >&2; exit 1; }
|
||||||
|
docker info >/dev/null 2>&1 || { echo "Docker daemon is unavailable" >&2; exit 1; }
|
||||||
|
|
||||||
|
if [[ -z "$IMAGE_TAG" ]]; then
|
||||||
|
IMAGE_TAG="gwknow:$(date +%Y%m%d-%H%M%S)"
|
||||||
|
elif [[ "$IMAGE_TAG" != *:* ]]; then
|
||||||
|
IMAGE_TAG="gwknow:${IMAGE_TAG}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Build frontend
|
HOST_UID="$(id -u)"
|
||||||
cd frontend
|
HOST_GID="$(id -g)"
|
||||||
npm install
|
mkdir -p .cargo-cache .npm-cache
|
||||||
npm run build
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
if [ "$BUILD_MODE" = "debug" ]; then
|
if [[ "$REBUILD_BUILDER" == true ]] || ! docker image inspect "$RUST_BUILDER_IMAGE" >/dev/null 2>&1; then
|
||||||
echo "Building htknow for debug with profiling..."
|
echo "==> Building Rust builder image: $RUST_BUILDER_IMAGE"
|
||||||
cargo build ${PROFILING_FLAG}
|
docker build -t "$RUST_BUILDER_IMAGE" -f Dockerfile.rust-builder .
|
||||||
if [ -n "$CUSTOM_IMAGE_TAG" ]; then
|
fi
|
||||||
IMAGE_TAG="${CUSTOM_IMAGE_TAG}-debug"
|
|
||||||
else
|
if [[ "$SKIP_FRONTEND" == false ]]; then
|
||||||
IMAGE_TAG="$(date +%Y%m%d%H%M)-debug"
|
echo "==> Building frontend with $NODE_IMAGE"
|
||||||
fi
|
docker run --rm \
|
||||||
DOCKERFILE="Dockerfile.debug"
|
--user "${HOST_UID}:${HOST_GID}" \
|
||||||
echo "Using Dockerfile.debug with jemalloc profiling tools"
|
-e HOME=/tmp \
|
||||||
|
-e npm_config_cache=/npm-cache \
|
||||||
|
-v "$ROOT_DIR":/app \
|
||||||
|
-v "$ROOT_DIR/.npm-cache":/npm-cache \
|
||||||
|
-w /app/frontend \
|
||||||
|
"$NODE_IMAGE" \
|
||||||
|
sh -c 'npm ci && npm run build'
|
||||||
else
|
else
|
||||||
echo "Building htknow for release (profiling disabled)..."
|
echo "==> Skipping frontend build (--skip-frontend)"
|
||||||
cargo build --release
|
|
||||||
if [ -n "$CUSTOM_IMAGE_TAG" ]; then
|
|
||||||
IMAGE_TAG="${CUSTOM_IMAGE_TAG}"
|
|
||||||
else
|
|
||||||
IMAGE_TAG="$(date +%Y%m%d%H%M)"
|
|
||||||
fi
|
|
||||||
DOCKERFILE="Dockerfile"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Build Docker image
|
echo "==> Building Rust release binary with $RUST_BUILDER_IMAGE"
|
||||||
echo "Building Docker image with ${DOCKERFILE}..."
|
docker run --rm \
|
||||||
docker build -f "${DOCKERFILE}" -t "htknow:${IMAGE_TAG}" -t htknow:latest .
|
--user "${HOST_UID}:${HOST_GID}" \
|
||||||
|
-e HOME=/tmp \
|
||||||
|
-e CARGO_HOME=/cargo-cache \
|
||||||
|
-v "$ROOT_DIR":/app \
|
||||||
|
-v "$ROOT_DIR/.cargo-cache":/cargo-cache \
|
||||||
|
-w /app \
|
||||||
|
"$RUST_BUILDER_IMAGE" \
|
||||||
|
bash -c 'cargo build --locked --release'
|
||||||
|
|
||||||
echo "Build complete!"
|
echo "==> Building runtime image: $IMAGE_TAG"
|
||||||
echo ""
|
docker build -f Dockerfile -t "$IMAGE_TAG" .
|
||||||
echo "Image tag: htknow:${IMAGE_TAG}"
|
|
||||||
echo "Latest tag: htknow:latest"
|
echo
|
||||||
echo "BUILT_IMAGE=htknow:${IMAGE_TAG}"
|
echo "Build complete: $IMAGE_TAG"
|
||||||
echo "BUILT_LATEST_IMAGE=htknow:latest"
|
echo "To deploy, update the compose image tag and recreate only the intended service."
|
||||||
echo "Build mode: ${BUILD_MODE}"
|
|
||||||
echo ""
|
|
||||||
echo "To run the container:"
|
|
||||||
echo " docker-compose up -d"
|
|
||||||
echo ""
|
|
||||||
echo "Or manually:"
|
|
||||||
echo " docker run -d -p 8080:8080 -v \$(pwd)/data:/app/data --name htknow htknow:${IMAGE_TAG}"
|
|
||||||
echo ""
|
|
||||||
echo "Usage:"
|
|
||||||
echo " ./build-docker.sh # Build in release mode (default)"
|
|
||||||
echo " ./build-docker.sh debug # Build in debug mode"
|
|
||||||
echo " IMAGE_TAG=v1.2.3 ./build-docker.sh # Use custom image tag"
|
|
||||||
|
|||||||
8349
src/processor.rs
8349
src/processor.rs
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user