# Dockerfile optimizado con cross-compilation nativa
# Este Dockerfile usa cross-compilation en lugar de emulación para ARM64
ARG RUST_IMAGE=rust:1.94.0-slim-trixie
# ============================================================================
# Etapa base común para ambas arquitecturas
# ============================================================================
FROM ${RUST_IMAGE} AS base
RUN apt-get update && apt-get install --no-install-recommends -y \
build-essential \
ca-certificates \
clang \
cmake \
curl \
gcc \
libclang-dev \
libc6-dev \
libssl-dev \
llvm-dev \
pkg-config \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# ============================================================================
# Etapa de compilación para AMD64 (nativa)
# ============================================================================
FROM base AS builder-amd64
RUN rustup target add x86_64-unknown-linux-gnu
ARG CARGO_PROFILE=release
ARG FEATURES=""
ENV CARGO_PROFILE=$CARGO_PROFILE
ENV CARGO_FEATURES=$FEATURES
COPY ./ave/http/Cargo.toml ./ave/http/Cargo.toml
COPY ./ave/identity/Cargo.toml ./ave/identity/Cargo.toml
COPY ./ave/core/Cargo.toml ./ave/core/Cargo.toml
COPY ./ave/bridge/Cargo.toml ./ave/bridge/Cargo.toml
COPY ./ave/network/Cargo.toml ./ave/network/Cargo.toml
COPY ./ave/common/Cargo.toml ./ave/common/Cargo.toml
COPY ./ave/Cargo.toml ./ave/Cargo.toml
COPY ./ave/Cargo.lock ./ave/Cargo.lock
COPY ./ave-actors/actor/Cargo.toml ./ave-actors/actor/Cargo.toml
COPY ./ave-actors/actor/README.md ./ave-actors/actor/README.md
COPY ./ave-actors/databases/rocksdb_db/Cargo.toml ./ave-actors/databases/rocksdb_db/Cargo.toml
COPY ./ave-actors/databases/rocksdb_db/README.md ./ave-actors/databases/rocksdb_db/README.md
COPY ./ave-actors/databases/sqlite_db/Cargo.toml ./ave-actors/databases/sqlite_db/Cargo.toml
COPY ./ave-actors/databases/sqlite_db/README.md ./ave-actors/databases/sqlite_db/README.md
COPY ./ave-actors/store/Cargo.toml ./ave-actors/store/Cargo.toml
COPY ./ave-actors/store/README.md ./ave-actors/store/README.md
COPY ./ave-actors/Cargo.toml ./ave-actors/Cargo.toml
COPY ./ave-actors/Cargo.lock ./ave-actors/Cargo.lock
COPY ./ave-actors/README.md ./ave-actors/README.md
COPY ./ave/http/src ./ave/http/src
COPY ./ave/http/migrations ./ave/http/migrations
COPY ./ave/identity/src ./ave/identity/src
COPY ./ave/core/src ./ave/core/src
COPY ./ave/core/migrations ./ave/core/migrations
COPY ./ave/bridge/src ./ave/bridge/src
COPY ./ave/network/src ./ave/network/src
COPY ./ave/common/src ./ave/common/src
COPY ./ave-actors/actor/src ./ave-actors/actor/src
COPY ./ave-actors/databases/rocksdb_db/src ./ave-actors/databases/rocksdb_db/src
COPY ./ave-actors/databases/sqlite_db/src ./ave-actors/databases/sqlite_db/src
COPY ./ave-actors/store/src ./ave-actors/store/src
COPY ./ave-actors/src ./ave-actors/src
WORKDIR /ave/http
RUN cargo build --target x86_64-unknown-linux-gnu --profile "$CARGO_PROFILE" --no-default-features --features "$CARGO_FEATURES"
# ============================================================================
# Etapa de compilación para ARM64 (cross-compilation nativa)
# ============================================================================
FROM base AS builder-arm64
RUN dpkg --add-architecture arm64 && \
apt-get update && apt-get install --no-install-recommends -y \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
libc6-dev-arm64-cross \
libssl-dev:arm64 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN rustup target add aarch64-unknown-linux-gnu && \
mkdir -p ~/.cargo && \
echo '[target.aarch64-unknown-linux-gnu]' > ~/.cargo/config.toml && \
echo 'linker = "aarch64-linux-gnu-gcc"' >> ~/.cargo/config.toml && \
echo 'rustflags = ["-C", "link-arg=-lgcc"]' >> ~/.cargo/config.toml
ARG CARGO_PROFILE=release
ARG FEATURES=""
ENV CARGO_PROFILE=$CARGO_PROFILE
ENV CARGO_FEATURES=$FEATURES
ENV CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc
ENV CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++
ENV AR_aarch64_unknown_linux_gnu=aarch64-linux-gnu-ar
ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
ENV OPENSSL_DIR=/usr
ENV OPENSSL_LIB_DIR=/usr/lib/aarch64-linux-gnu
ENV OPENSSL_INCLUDE_DIR=/usr/include
ENV BINDGEN_EXTRA_CLANG_ARGS="--sysroot=/usr/aarch64-linux-gnu -I/usr/aarch64-linux-gnu/include"
COPY ./ave/http/Cargo.toml ./ave/http/Cargo.toml
COPY ./ave/identity/Cargo.toml ./ave/identity/Cargo.toml
COPY ./ave/core/Cargo.toml ./ave/core/Cargo.toml
COPY ./ave/bridge/Cargo.toml ./ave/bridge/Cargo.toml
COPY ./ave/network/Cargo.toml ./ave/network/Cargo.toml
COPY ./ave/common/Cargo.toml ./ave/common/Cargo.toml
COPY ./ave/Cargo.toml ./ave/Cargo.toml
COPY ./ave/Cargo.lock ./ave/Cargo.lock
COPY ./ave-actors/actor/Cargo.toml ./ave-actors/actor/Cargo.toml
COPY ./ave-actors/actor/README.md ./ave-actors/actor/README.md
COPY ./ave-actors/databases/rocksdb_db/Cargo.toml ./ave-actors/databases/rocksdb_db/Cargo.toml
COPY ./ave-actors/databases/rocksdb_db/README.md ./ave-actors/databases/rocksdb_db/README.md
COPY ./ave-actors/databases/sqlite_db/Cargo.toml ./ave-actors/databases/sqlite_db/Cargo.toml
COPY ./ave-actors/databases/sqlite_db/README.md ./ave-actors/databases/sqlite_db/README.md
COPY ./ave-actors/store/Cargo.toml ./ave-actors/store/Cargo.toml
COPY ./ave-actors/store/README.md ./ave-actors/store/README.md
COPY ./ave-actors/Cargo.toml ./ave-actors/Cargo.toml
COPY ./ave-actors/Cargo.lock ./ave-actors/Cargo.lock
COPY ./ave-actors/README.md ./ave-actors/README.md
COPY ./ave/http/src ./ave/http/src
COPY ./ave/http/migrations ./ave/http/migrations
COPY ./ave/identity/src ./ave/identity/src
COPY ./ave/core/src ./ave/core/src
COPY ./ave/core/migrations ./ave/core/migrations
COPY ./ave/bridge/src ./ave/bridge/src
COPY ./ave/network/src ./ave/network/src
COPY ./ave/common/src ./ave/common/src
COPY ./ave-actors/actor/src ./ave-actors/actor/src
COPY ./ave-actors/databases/rocksdb_db/src ./ave-actors/databases/rocksdb_db/src
COPY ./ave-actors/databases/sqlite_db/src ./ave-actors/databases/sqlite_db/src
COPY ./ave-actors/store/src ./ave-actors/store/src
COPY ./ave-actors/src ./ave-actors/src
WORKDIR /ave/http
RUN cargo build --target aarch64-unknown-linux-gnu --profile "$CARGO_PROFILE" --no-default-features --features "$CARGO_FEATURES"
# ============================================================================
# Imágenes finales
# ============================================================================
FROM --platform=linux/amd64 ${RUST_IMAGE} AS amd64
ARG CARGO_PROFILE=release
RUN apt-get update && apt-get install --no-install-recommends -y \
ca-certificates \
libssl3t64 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN rustup target add wasm32-unknown-unknown
COPY --from=builder-amd64 ./ave/target/x86_64-unknown-linux-gnu/${CARGO_PROFILE}/ave-http /usr/local/bin/ave-http
CMD ["ave-http"]
FROM --platform=linux/arm64 ${RUST_IMAGE} AS arm64
ARG CARGO_PROFILE=release
RUN apt-get update && apt-get install --no-install-recommends -y \
ca-certificates \
libssl3t64 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN rustup target add wasm32-unknown-unknown
COPY --from=builder-arm64 ./ave/target/aarch64-unknown-linux-gnu/${CARGO_PROFILE}/ave-http /usr/local/bin/ave-http
CMD ["ave-http"]