Compare commits
19 Commits
v1.9.18
...
fix-docker
| Author | SHA1 | Date | |
|---|---|---|---|
| 0fc4ddbc28 | |||
| 9f8eab2ad2 | |||
| 69c483ac46 | |||
| ac178ccbb0 | |||
| 3f16828bdf | |||
| 0f7cd94e14 | |||
| 2cc6512afa | |||
| 151c98c884 | |||
| ba17d7940e | |||
| 46120dbd56 | |||
| 571c4797fa | |||
| c7d107a578 | |||
| 5f50e98a0a | |||
| 45f831ca1c | |||
| 73356cca30 | |||
| b7e630c1d8 | |||
| 13c8bc29ae | |||
| 51a892fd76 | |||
| 9cc8e573ec |
@@ -34,29 +34,34 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v3
|
|
||||||
with:
|
|
||||||
version: 10
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
|
- name: Setup pnpm
|
||||||
|
uses: pnpm/action-setup@v3
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
- name: 🔐 Registry Auth
|
- name: 🔐 Registry Auth
|
||||||
run: |
|
run: |
|
||||||
echo "@mintel:registry=https://git.infra.mintel.me/api/packages/mmintel/npm" > .npmrc
|
REGISTRY="${{ vars.REGISTRY_HOST || 'npm.infra.mintel.me' }}"
|
||||||
echo "//git.infra.mintel.me/api/packages/mmintel/npm/:_authToken=${{ secrets.NPM_TOKEN || secrets.MINTEL_PRIVATE_TOKEN || secrets.GITEA_PAT }}" >> .npmrc
|
echo "@mintel:registry=https://$REGISTRY" > .npmrc
|
||||||
|
echo "//$REGISTRY/:_authToken=${{ secrets.NPM_TOKEN || secrets.GITEA_PAT || secrets.MINTEL_PRIVATE_TOKEN }}" >> .npmrc
|
||||||
|
- name: 🔍 Diagnostics
|
||||||
|
run: |
|
||||||
|
echo "👤 User: $(id)"
|
||||||
|
echo "📂 Directory: $(pwd)"
|
||||||
|
echo "📂 Disk Space:"
|
||||||
|
df -h
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
pnpm store prune
|
rm -rf .next .turbo node_modules || true
|
||||||
pnpm install --no-frozen-lockfile
|
pnpm install --no-frozen-lockfile --reporter=append-only
|
||||||
- name: 📦 Archive dependencies
|
- name: 📦 Archive dependencies
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: node_modules
|
name: node_modules
|
||||||
path: |
|
path: node_modules
|
||||||
node_modules
|
|
||||||
.npmrc
|
|
||||||
retention-days: 1
|
retention-days: 1
|
||||||
|
|
||||||
static:
|
static:
|
||||||
@@ -77,7 +82,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- name: 📥 Restore dependencies
|
- name: 📥 Restore dependencies
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: node_modules
|
name: node_modules
|
||||||
- name: 🌐 HTML Validation
|
- name: 🌐 HTML Validation
|
||||||
@@ -109,7 +114,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- name: 📥 Restore dependencies
|
- name: 📥 Restore dependencies
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: node_modules
|
name: node_modules
|
||||||
- name: 🔍 Install Chromium
|
- name: 🔍 Install Chromium
|
||||||
@@ -147,7 +152,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
- name: 📥 Restore dependencies
|
- name: 📥 Restore dependencies
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: node_modules
|
name: node_modules
|
||||||
- name: 📦 Depcheck
|
- name: 📦 Depcheck
|
||||||
@@ -177,7 +182,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
version: 10
|
version: 10
|
||||||
- name: 📥 Restore dependencies
|
- name: 📥 Restore dependencies
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: node_modules
|
name: node_modules
|
||||||
- name: 🔍 Install Chromium
|
- name: 🔍 Install Chromium
|
||||||
|
|||||||
177
blender-mv.sh
Executable file
177
blender-mv.sh
Executable file
@@ -0,0 +1,177 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# blender-mv: A smart file/directory mover that automatically updates Blender paths
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
print_usage() {
|
||||||
|
echo "Usage: blender-mv [OPTIONS] SOURCE DEST"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " --search-project <dir> Scan this specific project directory for .blend files"
|
||||||
|
echo " to update (useful if you move an external asset folder,"
|
||||||
|
echo " and old .blend files referencing it are elsewhere)."
|
||||||
|
echo ""
|
||||||
|
echo "Example: blender-mv ./old_folder ./new_folder"
|
||||||
|
}
|
||||||
|
|
||||||
|
SEARCH_PROJECT=""
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while [[ "$#" -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--search-project) SEARCH_PROJECT="$2"; shift 2 ;;
|
||||||
|
-h|--help) print_usage; exit 0 ;;
|
||||||
|
*)
|
||||||
|
if [[ -z "$SOURCE" ]]; then
|
||||||
|
SOURCE="$1"
|
||||||
|
elif [[ -z "$DEST" ]]; then
|
||||||
|
DEST="$1"
|
||||||
|
else
|
||||||
|
echo "Unknown parameter passed: $1"
|
||||||
|
print_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z "$SOURCE" || -z "$DEST" ]]; then
|
||||||
|
echo "Error: Both SOURCE and DEST must be provided."
|
||||||
|
print_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -e "$SOURCE" ]]; then
|
||||||
|
echo "Error: Source path '$SOURCE' does not exist."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Function to get absolute normalized path (handles missing destination gracefully)
|
||||||
|
get_abs_path() {
|
||||||
|
python3 -c 'import os,sys; print(os.path.normpath(os.path.abspath(sys.argv[1])))' "$1" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Resolve source before moving
|
||||||
|
ABS_SOURCE=$(get_abs_path "$SOURCE")
|
||||||
|
|
||||||
|
# Determine resulting target path
|
||||||
|
if [[ -d "$DEST" ]]; then
|
||||||
|
# If DEST is an existing dir, standard mv puts SOURCE inside it
|
||||||
|
BASENAME_SOURCE=$(basename "$SOURCE")
|
||||||
|
ABS_DEST=$(get_abs_path "$DEST/$BASENAME_SOURCE")
|
||||||
|
else
|
||||||
|
# Placed exactly at DEST (rename or target dir doesn't exist yet)
|
||||||
|
ABS_DEST=$(get_abs_path "$DEST")
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Moving: $SOURCE -> $DEST"
|
||||||
|
mv "$SOURCE" "$DEST"
|
||||||
|
|
||||||
|
echo "Replacing paths in Blender's recent-files lists..."
|
||||||
|
# Find all recent-files.txt across Blender versions and replace the string
|
||||||
|
find "$HOME/Library/Application Support/Blender" -type f -name "recent-files.txt" 2>/dev/null | while read -r RECENT_FILE; do
|
||||||
|
# Using sed with alternative delimiter to avoid path interference
|
||||||
|
sed -i '' "s|${ABS_SOURCE}|${ABS_DEST}|g" "$RECENT_FILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Prepare the embedded Python payload to update blend paths
|
||||||
|
TMP_PY=$(mktemp /tmp/blender_update_paths.XXXXXX.py)
|
||||||
|
cat << 'EOF' > "$TMP_PY"
|
||||||
|
import bpy
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def replace_in_prop(prop, old_path, new_path):
|
||||||
|
if prop and isinstance(prop, str) and old_path in prop:
|
||||||
|
return prop.replace(old_path, new_path)
|
||||||
|
return prop
|
||||||
|
|
||||||
|
def run():
|
||||||
|
# Args are passed after `--`
|
||||||
|
if '--' not in sys.argv:
|
||||||
|
return
|
||||||
|
idx = sys.argv.index('--')
|
||||||
|
if len(sys.argv) <= idx + 2:
|
||||||
|
return
|
||||||
|
|
||||||
|
old_path = sys.argv[idx + 1]
|
||||||
|
new_path = sys.argv[idx + 2]
|
||||||
|
|
||||||
|
changed = False
|
||||||
|
|
||||||
|
# 1. Libraries (Linked objects/collections)
|
||||||
|
for lib in bpy.data.libraries:
|
||||||
|
new_fp = replace_in_prop(lib.filepath, old_path, new_path)
|
||||||
|
if new_fp != lib.filepath:
|
||||||
|
lib.filepath = new_fp
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
# 2. Images (Textures, Env Maps)
|
||||||
|
for img in bpy.data.images:
|
||||||
|
new_fp = replace_in_prop(img.filepath, old_path, new_path)
|
||||||
|
if new_fp != img.filepath:
|
||||||
|
img.filepath = new_fp
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
# 3. Cache files (Alembic/VDB)
|
||||||
|
for cache in bpy.data.cache_files:
|
||||||
|
new_fp = replace_in_prop(cache.filepath, old_path, new_path)
|
||||||
|
if new_fp != cache.filepath:
|
||||||
|
cache.filepath = new_fp
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
# 4. Fonts
|
||||||
|
for font in bpy.data.fonts:
|
||||||
|
new_fp = replace_in_prop(font.filepath, old_path, new_path)
|
||||||
|
if new_fp != font.filepath:
|
||||||
|
font.filepath = new_fp
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
# 5. Video strips
|
||||||
|
for scene in bpy.data.scenes:
|
||||||
|
if scene.sequence_editor:
|
||||||
|
for strip in scene.sequence_editor.sequences_all:
|
||||||
|
if strip.type in ('MOVIE', 'IMAGE'):
|
||||||
|
new_fp = replace_in_prop(strip.filepath, old_path, new_path)
|
||||||
|
if new_fp != strip.filepath:
|
||||||
|
strip.filepath = new_fp
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
if changed:
|
||||||
|
print(f"[*] Updated paths in {bpy.data.filepath}")
|
||||||
|
bpy.ops.wm.save_mainfile()
|
||||||
|
|
||||||
|
try:
|
||||||
|
run()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[!] Error updating blend file paths: {e}")
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Determine what to search for blend files
|
||||||
|
if [[ -n "$SEARCH_PROJECT" ]]; then
|
||||||
|
SEARCH_ROOT=$(get_abs_path "$SEARCH_PROJECT")
|
||||||
|
echo "Scanning project root '$SEARCH_ROOT' for .blend files..."
|
||||||
|
elif [[ -d "$ABS_DEST" ]]; then
|
||||||
|
SEARCH_ROOT="$ABS_DEST"
|
||||||
|
echo "Scanning moved directory for .blend files..."
|
||||||
|
elif [[ "$ABS_DEST" == *.blend ]]; then
|
||||||
|
SEARCH_ROOT="$ABS_DEST"
|
||||||
|
echo "Updating moved .blend file..."
|
||||||
|
else
|
||||||
|
echo "No project root defined and moved object is not a directory or .blend file."
|
||||||
|
echo "Finished."
|
||||||
|
rm -f "$TMP_PY"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute headless blender on all found blend files
|
||||||
|
if [[ -d "$SEARCH_ROOT" ]]; then
|
||||||
|
find "$SEARCH_ROOT" -type f -name "*.blend" -print0 | while IFS= read -r -d '' BLEND_FILE; do
|
||||||
|
blender -b "$BLEND_FILE" -P "$TMP_PY" -- "$ABS_SOURCE" "$ABS_DEST" >/dev/null 2>&1 || echo "Warning: Failed to process $BLEND_FILE"
|
||||||
|
done
|
||||||
|
elif [[ -f "$SEARCH_ROOT" && "$SEARCH_ROOT" == *.blend ]]; then
|
||||||
|
blender -b "$SEARCH_ROOT" -P "$TMP_PY" -- "$ABS_SOURCE" "$ABS_DEST" >/dev/null 2>&1 || echo "Warning: Failed to process $SEARCH_ROOT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f "$TMP_PY"
|
||||||
|
echo "Success: Move complete and paths updated."
|
||||||
@@ -18,7 +18,7 @@ services:
|
|||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
ports:
|
ports:
|
||||||
- "3001:3001"
|
- "3011:3001"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- mcp-network
|
- mcp-network
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ FROM node:20-alpine AS builder
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json pnpm-lock.yaml* ./
|
COPY package.json pnpm-lock.yaml* ./
|
||||||
RUN corepack enable pnpm && pnpm install
|
RUN npm install -g pnpm@10.18.3 && pnpm install
|
||||||
|
|
||||||
COPY tsconfig.json ./
|
COPY tsconfig.json ./
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
FROM node:20-bookworm-slim AS builder
|
FROM node:20-bookworm-slim AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN corepack enable pnpm && pnpm install --ignore-workspace
|
RUN npm install -g pnpm@10.18.3 && pnpm install --ignore-workspace
|
||||||
COPY tsconfig.json ./
|
COPY tsconfig.json ./
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
RUN pnpm build
|
RUN pnpm build
|
||||||
|
|||||||
@@ -56,7 +56,17 @@ fi
|
|||||||
# 3. Global Docker Pruning
|
# 3. Global Docker Pruning
|
||||||
echo "🧹 Pruning Docker resources..."
|
echo "🧹 Pruning Docker resources..."
|
||||||
docker system prune -af --filter "until=24h"
|
docker system prune -af --filter "until=24h"
|
||||||
|
|
||||||
|
echo "🧹 Pruning BuildKit builder containers and cache..."
|
||||||
|
# Remove orphaned buildkit containers to release volume locks
|
||||||
|
docker rm -f $(docker ps -aq --filter name=buildx_buildkit_builder) 2>/dev/null || true
|
||||||
|
docker builder prune -af || true
|
||||||
|
docker buildx prune -af || true
|
||||||
|
|
||||||
|
echo "🧹 Pruning Docker volumes..."
|
||||||
docker volume prune -f
|
docker volume prune -f
|
||||||
|
# Force remove dangling buildx state volumes that might bypass standard prune
|
||||||
|
docker volume ls -q | grep buildx | xargs -r docker volume rm 2>/dev/null || true
|
||||||
|
|
||||||
echo "✅ Optimization complete!"
|
echo "✅ Optimization complete!"
|
||||||
df -h /mnt/HC_Volume_104796416
|
df -h /mnt/HC_Volume_104796416
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# Configuration
|
# Find registry data dynamically (volume ID might change)
|
||||||
REGISTRY_DATA="/mnt/HC_Volume_104575103/registry-data/docker/registry/v2"
|
REGISTRY_DATA=$(find /mnt -maxdepth 5 -type d -path '*/registry-data/docker/registry/v2' | head -n 1)
|
||||||
|
|
||||||
|
if [ -z "$REGISTRY_DATA" ]; then
|
||||||
|
echo "❌ Registry data directory not found!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
KEEP_TAGS=3
|
KEEP_TAGS=3
|
||||||
|
|
||||||
echo "🏥 Starting Aggressive Registry & Docker Maintenance..."
|
echo "🏥 Starting Aggressive Registry & Docker Maintenance..."
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
FROM node:20-bookworm-slim AS builder
|
FROM node:20-bookworm-slim AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN corepack enable pnpm && pnpm install --ignore-workspace
|
RUN npm install -g pnpm@10.18.3 && pnpm install --ignore-workspace
|
||||||
COPY tsconfig.json ./
|
COPY tsconfig.json ./
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
RUN pnpm build
|
RUN pnpm build
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
FROM node:20-bookworm-slim AS builder
|
FROM node:20-bookworm-slim AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN corepack enable pnpm && pnpm install --ignore-workspace
|
RUN npm install -g pnpm@10.18.3 && pnpm install --ignore-workspace
|
||||||
RUN for dir in $(find /app/node_modules -type d -name "sharp" | grep "node_modules/sharp$"); do \
|
RUN for dir in $(find /app/node_modules -type d -name "sharp" | grep "node_modules/sharp$"); do \
|
||||||
echo "module.exports = {};" > "$dir/lib/index.js" || true; \
|
echo "module.exports = {};" > "$dir/lib/index.js" || true; \
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -8,11 +8,6 @@ import path from "node:path";
|
|||||||
export const baseNextConfig = {
|
export const baseNextConfig = {
|
||||||
output: "standalone",
|
output: "standalone",
|
||||||
turbopack: {},
|
turbopack: {},
|
||||||
experimental: {
|
|
||||||
serverActions: {
|
|
||||||
allowedOrigins: ["*.klz-cables.com", "*.branch.klz-cables.com", "localhost:3000", "*.mintel.me"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
images: {
|
images: {
|
||||||
dangerouslyAllowSVG: true,
|
dangerouslyAllowSVG: true,
|
||||||
contentDispositionType: "attachment",
|
contentDispositionType: "attachment",
|
||||||
@@ -58,6 +53,31 @@ const withMintelConfig = (config) => {
|
|||||||
|
|
||||||
let nextConfig = { ...baseNextConfig, ...config };
|
let nextConfig = { ...baseNextConfig, ...config };
|
||||||
|
|
||||||
|
// Explicitly merge rewrites
|
||||||
|
nextConfig.rewrites = async () => {
|
||||||
|
const defaultRewrites = await baseNextConfig.rewrites();
|
||||||
|
let customRewrites = {};
|
||||||
|
if (typeof config.rewrites === 'function') {
|
||||||
|
customRewrites = await config.rewrites();
|
||||||
|
} else if (Array.isArray(config.rewrites)) {
|
||||||
|
customRewrites = config.rewrites;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Array.isArray(customRewrites)) {
|
||||||
|
return {
|
||||||
|
beforeFiles: [...customRewrites, ...defaultRewrites],
|
||||||
|
afterFiles: [],
|
||||||
|
fallback: [],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
beforeFiles: [...(customRewrites.beforeFiles || []), ...defaultRewrites],
|
||||||
|
afterFiles: customRewrites.afterFiles || [],
|
||||||
|
fallback: customRewrites.fallback || [],
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
if (hasI18nConfig) {
|
if (hasI18nConfig) {
|
||||||
const withNextIntl = createNextIntlPlugin();
|
const withNextIntl = createNextIntlPlugin();
|
||||||
nextConfig = withNextIntl(nextConfig);
|
nextConfig = withNextIntl(nextConfig);
|
||||||
@@ -76,3 +96,4 @@ const withMintelConfig = (config) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default withMintelConfig;
|
export default withMintelConfig;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
FROM node:20-bookworm-slim AS builder
|
FROM node:20-bookworm-slim AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN corepack enable pnpm && pnpm install --ignore-workspace
|
RUN npm install -g pnpm@10.18.3 && pnpm install --ignore-workspace
|
||||||
COPY tsconfig.json ./
|
COPY tsconfig.json ./
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
RUN pnpm build
|
RUN pnpm build
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
FROM node:20-bookworm-slim AS builder
|
FROM node:20-bookworm-slim AS builder
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN corepack enable pnpm && pnpm install --ignore-workspace
|
RUN npm install -g pnpm@10.18.3 && pnpm install --ignore-workspace
|
||||||
COPY tsconfig.json ./
|
COPY tsconfig.json ./
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
RUN pnpm build
|
RUN pnpm build
|
||||||
|
|||||||
Reference in New Issue
Block a user