Files
51l3nt51n-blog/Dockerfile

82 lines
2.2 KiB
Docker

# Build Stage
FROM rust:1.88-bookworm AS builder
WORKDIR /app
# Install sqlite3 for compile-time query checking
RUN apt-get update && apt-get install -y sqlite3 && rm -rf /var/lib/apt/lists/*
# Cache dependencies
RUN cargo init --name blog_cms .
COPY Cargo.toml Cargo.lock ./
RUN cargo build --release
RUN rm src/*.rs
# Copy real source
COPY src ./src
COPY templates ./templates
# Create a temporary SQLite DB with the schema for sqlx compile-time checks
RUN sqlite3 /tmp/build.db " \
CREATE TABLE users ( \
id INTEGER PRIMARY KEY AUTOINCREMENT, \
username TEXT NOT NULL UNIQUE, \
password_hash TEXT NOT NULL, \
role TEXT NOT NULL DEFAULT 'readonly' \
); \
CREATE TABLE sessions ( \
id TEXT PRIMARY KEY, \
user_id INTEGER NOT NULL, \
expires_at INTEGER NOT NULL, \
FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE \
); \
CREATE TABLE posts ( \
id INTEGER PRIMARY KEY AUTOINCREMENT, \
author_id INTEGER NOT NULL, \
title TEXT NOT NULL, \
content TEXT NOT NULL, \
tags TEXT NOT NULL DEFAULT '', \
categories TEXT NOT NULL DEFAULT '', \
visibility TEXT NOT NULL DEFAULT 'public', \
password TEXT, \
created_at INTEGER NOT NULL, \
updated_at INTEGER NOT NULL, \
FOREIGN KEY(author_id) REFERENCES users(id) ON DELETE CASCADE \
); \
CREATE TABLE attachments ( \
id TEXT PRIMARY KEY, \
filename TEXT NOT NULL, \
content_type TEXT NOT NULL, \
size INTEGER NOT NULL, \
created_at INTEGER NOT NULL \
);"
# Rebuild the real source with DATABASE_URL for sqlx macros
ENV DATABASE_URL=sqlite:///tmp/build.db
RUN touch src/main.rs && cargo build --release
# Final Stage
FROM debian:bookworm-slim
WORKDIR /app
# Install runtime dependencies
RUN apt-get update && apt-get install -y \
ca-certificates \
libsqlite3-0 \
&& rm -rf /var/lib/apt/lists/*
# Copy the binary from the builder
COPY --from=builder /app/target/release/blog_cms .
# Create directories for attachments and database
RUN mkdir -p attachments data
# Default environment variables
ENV PORT=3000
ENV DATABASE_URL=sqlite:///app/data/data.db
EXPOSE 3000
CMD ["./blog_cms"]