You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.5 KiB
93 lines
2.5 KiB
# Multi-stage build for GitCitadel Online |
|
# Stage 1: Build Go application |
|
FROM golang:1.22-alpine AS go-builder |
|
|
|
# Install build dependencies |
|
RUN apk add --no-cache git make |
|
|
|
WORKDIR /build |
|
|
|
# Copy go mod files |
|
COPY go.mod go.sum ./ |
|
RUN go mod download |
|
|
|
# Copy source code |
|
COPY . . |
|
|
|
# Build the application |
|
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o gitcitadel-online ./cmd/server/main.go |
|
|
|
# Stage 2: Build and install gc-parser from local directory |
|
# We copy the local gc-parser directory, build it, and install it to avoid git repository access issues |
|
FROM node:18-alpine AS node-setup |
|
|
|
WORKDIR /app |
|
|
|
# Copy package.json and the local gc-parser directory |
|
COPY package.json package-lock.json* ./ |
|
COPY gc-parser ./gc-parser |
|
|
|
# Build gc-parser (install dependencies and compile TypeScript) |
|
WORKDIR /app/gc-parser |
|
RUN npm install && npm run build |
|
|
|
# Go back to /app and install gc-parser from local directory |
|
# This will install gc-parser and @asciidoctor/core (as a dependency of gc-parser) |
|
WORKDIR /app |
|
RUN npm install ./gc-parser |
|
|
|
# Verify gc-parser is installed and can be required |
|
RUN node -e "require('gc-parser'); console.log('✓ gc-parser installed and verified')" || \ |
|
(echo "Error: gc-parser verification failed" && exit 1) |
|
|
|
# Ensure gc-parser is a directory, not a symlink (for proper copying to final stage) |
|
RUN if [ -L node_modules/gc-parser ]; then \ |
|
echo "Warning: gc-parser is a symlink, copying as directory..."; \ |
|
rm node_modules/gc-parser; \ |
|
cp -r gc-parser node_modules/gc-parser; \ |
|
fi |
|
|
|
# Stage 3: Final runtime image |
|
FROM alpine:latest |
|
|
|
# Install runtime dependencies |
|
RUN apk add --no-cache \ |
|
ca-certificates \ |
|
wget \ |
|
nodejs \ |
|
npm \ |
|
git \ |
|
&& rm -rf /var/cache/apk/* |
|
|
|
WORKDIR /app |
|
|
|
# Copy Node.js dependencies from node-setup stage |
|
COPY --from=node-setup /app/node_modules ./node_modules |
|
|
|
# Copy built Go binary from go-builder stage |
|
COPY --from=go-builder /build/gitcitadel-online . |
|
|
|
# Copy necessary files |
|
COPY scripts ./scripts |
|
COPY static ./static |
|
COPY templates ./templates |
|
COPY docker-entrypoint.sh ./ |
|
|
|
# Make entrypoint executable |
|
RUN chmod +x docker-entrypoint.sh |
|
|
|
# Create cache directory |
|
RUN mkdir -p cache/media && chmod 755 cache |
|
|
|
# Expose port |
|
EXPOSE 8080 |
|
|
|
# Health check |
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ |
|
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1 |
|
|
|
# Use entrypoint script |
|
ENTRYPOINT ["./docker-entrypoint.sh"] |
|
|
|
# Run the application |
|
CMD ["./gitcitadel-online"]
|
|
|