vane 0.9.2

A flow-based reverse proxy with multi-layer routing and programmable pipelines.
FROM rustlang/rust:nightly-slim AS builder

ARG TARGETARCH
ARG UPX_VERSION=5.0.2
ARG PROXY_URL="http://host.docker.internal:7890"

WORKDIR /app

# Install Dependencies & Tools
RUN if [ -n "$PROXY_URL" ]; then export http_proxy="$PROXY_URL" https_proxy="$PROXY_URL" all_proxy="socks5://${PROXY_URL#*//}"; fi \
    && apt-get update && apt-get install -y musl-tools pkg-config libssl-dev curl xz-utils cmake clang git \
    && rustup target add x86_64-unknown-linux-musl aarch64-unknown-linux-musl

# Install UPX
RUN if [ -n "$PROXY_URL" ]; then export http_proxy="$PROXY_URL" https_proxy="$PROXY_URL" all_proxy="socks5://${PROXY_URL#*//}"; fi \
    && case "$TARGETARCH" in \
        "amd64") UPX_ARCH="amd64" ;; \
        "arm64") UPX_ARCH="arm64" ;; \
        *) echo "Unsupported architecture: $TARGETARCH" && exit 1 ;; \
    esac \
    && curl -Lo upx.tar.xz "https://github.com/upx/upx/releases/download/v${UPX_VERSION}/upx-${UPX_VERSION}-${UPX_ARCH}_linux.tar.xz" \
    && tar -xf upx.tar.xz \
    && mv upx-${UPX_VERSION}-${UPX_ARCH}_linux/upx /usr/local/bin/ \
    && rm -rf upx.tar.xz upx-${UPX_VERSION}-${UPX_ARCH}_linux

# Cache Rust Dependencies
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs
# Build dependencies only
RUN if [ -n "$PROXY_URL" ]; then export http_proxy="$PROXY_URL" https_proxy="$PROXY_URL" all_proxy="socks5://${PROXY_URL#*//}"; fi \
    && case "$TARGETARCH" in \
        "amd64") cargo build --release --target x86_64-unknown-linux-musl ;; \
        "arm64") cargo build --release --target aarch64-unknown-linux-musl ;; \
    esac

COPY . .
# Touch main.rs to force cargo to rebuild the binary
RUN touch src/main.rs \
    && if [ -n "$PROXY_URL" ]; then export http_proxy="$PROXY_URL" https_proxy="$PROXY_URL" all_proxy="socks5://${PROXY_URL#*//}"; fi \
		&& export CC_x86_64_unknown_linux_musl=musl-gcc \
    && export CC_aarch64_unknown_linux_musl=musl-gcc \
    && case "$TARGETARCH" in \
        "amd64") \
						export CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc \
            && cargo build --release --target x86_64-unknown-linux-musl \
            && upx --best --lzma target/x86_64-unknown-linux-musl/release/vane \
            && cp target/x86_64-unknown-linux-musl/release/vane /app/vane ;; \
        "arm64") \
						export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=musl-gcc \
            && cargo build --release --target aarch64-unknown-linux-musl \
            && upx --best --lzma target/aarch64-unknown-linux-musl/release/vane \
            && cp target/aarch64-unknown-linux-musl/release/vane /app/vane ;; \
    esac

FROM scratch

WORKDIR /app
COPY --from=builder /app/vane ./vane

WORKDIR /root/vane
COPY --from=builder /app/LICENSE /app/README.md /app/CHANGELOG.md /app/SECURITY.md ./

WORKDIR /app
CMD ["./vane"]