# get the base image FROM rust:1.66-slim AS build # install build dependencies RUN apt update \ && apt install -y --no-install-recommends lsb-release apt-transport-https \ build-essential curl wget pkg-config libssl-dev # vars ENV PERSEUS_VERSION=0.4.0-beta.21 \ PERSEUS_SIZE_OPT_VERSION=0.1.9 \ ESBUILD_VERSION=0.14.7 \ BINARYEN_VERSION=112 # prepare root project dir WORKDIR /app # download the target for wasm RUN rustup target add wasm32-unknown-unknown # install wasm-pack RUN cargo install wasm-pack # retrieve the src dir COPY . . # RUN curl https://git.albv.org/alban/fast-insiders/archive/master.tar.gz | tar -xz # go to src dir WORKDIR /app/client # install perseus-cli RUN cargo install perseus-cli --version $PERSEUS_VERSION # clean and prep app RUN perseus clean # specify deps in app config RUN sed -i s"/perseus = .*/perseus = \"${PERSEUS_VERSION}\"/" ./Cargo.toml \ && sed -i s"/perseus-size-opt = .*/perseus-size-opt = \"${PERSEUS_SIZE_OPT_VERSION}\"/" ./Cargo.toml \ && cat ./Cargo.toml # modify main.rs RUN sed -i s'/SizeOpts::default()/SizeOpts { wee_alloc: true, lto: true, opt_level: "s".to_string(), codegen_units: 1, enable_fluent_bundle_patch: false, }/' ./src/main.rs \ && cat ./src/main.rs ARG API_URL ENV API_URL $API_URL # run plugin(s) to adjust app RUN perseus tinker # single-threaded perseus CLI mode required for low memory environments #ENV PERSEUS_CLI_SEQUENTIAL=true # deploy app RUN perseus deploy # go back to app dir WORKDIR /app # download and unpack esbuild RUN curl -O https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-${ESBUILD_VERSION}.tgz \ && tar xf esbuild-linux-64-${ESBUILD_VERSION}.tgz \ && ./package/bin/esbuild --version # run esbuild against bundle.js RUN ./package/bin/esbuild ./client/pkg/dist/pkg/perseus_engine.js --minify --target=es6 --outfile=./client/pkg/dist/pkg/perseus_engine.js --allow-overwrite \ && ls -lha ./client/pkg/dist/pkg # download and unpack binaryen RUN wget -nv https://github.com/WebAssembly/binaryen/releases/download/version_${BINARYEN_VERSION}/binaryen-version_${BINARYEN_VERSION}-x86_64-linux.tar.gz \ && tar xf binaryen-version_${BINARYEN_VERSION}-x86_64-linux.tar.gz \ && ./binaryen-version_${BINARYEN_VERSION}/bin/wasm-opt --version # run wasm-opt against bundle.wasm RUN ./binaryen-version_${BINARYEN_VERSION}/bin/wasm-opt -Os ./client/pkg/dist/pkg/perseus_engine_bg.wasm -o ./client/pkg/dist/pkg/perseus_engine_bg.wasm # prepare deployment image FROM debian:stable-slim WORKDIR /app COPY --from=build /app/client/pkg /app/ ENV HOST=0.0.0.0 CMD ./server