From d26a7ad337a640fdfd631938c017023a3587f10c Mon Sep 17 00:00:00 2001 From: Dessalines Date: Mon, 23 Nov 2020 10:59:06 -0500 Subject: [PATCH] Trying out cargo chef and a travis docker image cache. (#1238) * Trying out cargo chef and a travis docker image cache. * trying to change internal target. * Use latest cargo-chef with --target * Remove caching for now. * Adding back in chowns * Adding back in cache. * Remove travis caching. * Switching dev dockerfile to match prod, using cargo-chef and alpine. * Make travis happy * Trying a chown rust. * Caching cargo-chef first. * Moving the chowns * Removing many copy commands. * Go back to rust 1.47.0 due to config-rs breaking. * Adding the old volume mount version. * Adding some script comments. Co-authored-by: Luca Palmieri --- .dockerignore | 10 +-- docker/dev/Dockerfile | 77 ++++++++++++++++++------ docker/dev/docker_update.sh | 4 ++ docker/dev/docker_update_volume_mount.sh | 11 ++++ docker/dev/volume_mount.dockerfile | 35 +++++++++++ docker/prod/Dockerfile | 42 +++++++++++-- 6 files changed, 148 insertions(+), 31 deletions(-) create mode 100755 docker/dev/docker_update_volume_mount.sh create mode 100644 docker/dev/volume_mount.dockerfile diff --git a/.dockerignore b/.dockerignore index b336eeeb1..3a0f82b48 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,8 @@ # build folders and similar which are not needed for the docker build target -docker/dev/volumes -docker/prod/volumes -docker/federation/volumes -docker/travis/volumes -.git +docker +api_tests ansible +tests +.git +*.sh diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile index d10e72635..eba8e1ea8 100644 --- a/docker/dev/Dockerfile +++ b/docker/dev/Dockerfile @@ -1,35 +1,72 @@ -# syntax=docker/dockerfile:experimental -FROM rust:1.47-buster as rust +ARG RUST_BUILDER_IMAGE=ekidd/rust-musl-builder:1.47.0 -ENV HOME=/home/root +# Cargo chef plan +FROM $RUST_BUILDER_IMAGE as planner +WORKDIR /app +RUN cargo install cargo-chef --version 0.1.6 + +# Copy dirs +COPY ./ ./ + +RUN sudo chown -R rust:rust . +RUN cargo chef prepare --recipe-path recipe.json + +# Cargo chef cache dependencies +FROM $RUST_BUILDER_IMAGE as cacher +ARG CARGO_BUILD_TARGET=x86_64-unknown-linux-musl +WORKDIR /app +RUN cargo install cargo-chef --version 0.1.6 +COPY --from=planner /app/recipe.json ./recipe.json +RUN sudo chown -R rust:rust . +RUN cargo chef cook --target ${CARGO_BUILD_TARGET} --recipe-path recipe.json + +# Build the project +FROM $RUST_BUILDER_IMAGE as builder + +ARG CARGO_BUILD_TARGET=x86_64-unknown-linux-musl +ARG RUSTRELEASEDIR="debug" WORKDIR /app -# Copy the source folders -COPY . ./ +# Copy over the cached dependencies +COPY --from=cacher /app/target target +COPY --from=cacher /home/rust/.cargo /home/rust/.cargo + +# Copy the rest of the dirs +COPY ./ ./ + +RUN sudo chown -R rust:rust . +RUN cargo build -# Build for debug -RUN --mount=type=cache,target=/usr/local/cargo/registry \ - --mount=type=cache,target=/app/target \ - cargo build -RUN --mount=type=cache,target=/app/target \ - cp target/debug/lemmy_server lemmy_server +# reduce binary size +RUN strip ./target/$CARGO_BUILD_TARGET/$RUSTRELEASEDIR/lemmy_server -FROM peaceiris/mdbook:v0.3.7 as docs +RUN cp ./target/$CARGO_BUILD_TARGET/$RUSTRELEASEDIR/lemmy_server /app/lemmy_server + +# Build the docs +FROM $RUST_BUILDER_IMAGE as docs WORKDIR /app -COPY docs ./docs +COPY --chown=rust:rust docs ./docs RUN mdbook build docs/ -FROM ubuntu:20.10 +# The alpine runner +FROM alpine:3.12 as lemmy + +# Install libpq for postgres +RUN apk add libpq + +# Install Espeak for captchas +RUN apk add espeak -# Install libpq for postgres and espeak -RUN apt-get update -y -RUN apt-get install -y libpq-dev espeak +RUN addgroup -g 1000 lemmy +RUN adduser -D -s /bin/sh -u 1000 -G lemmy lemmy # Copy resources -COPY config/defaults.hjson /config/defaults.hjson -COPY --from=rust /app/lemmy_server /app/lemmy -COPY --from=docs /app/docs/book/ /app/documentation/ +COPY --chown=lemmy:lemmy config/defaults.hjson /config/defaults.hjson +COPY --chown=lemmy:lemmy --from=builder /app/lemmy_server /app/lemmy +COPY --chown=lemmy:lemmy --from=docs /app/docs/book/ /app/documentation/ +RUN chown lemmy:lemmy /app/lemmy +USER lemmy EXPOSE 8536 CMD ["/app/lemmy"] diff --git a/docker/dev/docker_update.sh b/docker/dev/docker_update.sh index d99f4ddf6..4531a1bdd 100755 --- a/docker/dev/docker_update.sh +++ b/docker/dev/docker_update.sh @@ -1,4 +1,8 @@ #!/bin/sh + +# This script uses a docker file that builds with musl, and runs on linux alpine +# Its a bit slower for development than the volume mount. + set -e mkdir -p volumes/pictrs diff --git a/docker/dev/docker_update_volume_mount.sh b/docker/dev/docker_update_volume_mount.sh new file mode 100755 index 000000000..ef68f1fd4 --- /dev/null +++ b/docker/dev/docker_update_volume_mount.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +# This script uses a Dockerfile that takes advantage of docker volume mounts, +# And runs on an ubuntu image. A little faster for development than the other +# script + +mkdir -p volumes/pictrs +sudo chown -R 991:991 volumes/pictrs +sudo docker build ../../ --file ../dev/volume_mount.dockerfile -t lemmy-dev:latest +sudo docker-compose up -d diff --git a/docker/dev/volume_mount.dockerfile b/docker/dev/volume_mount.dockerfile new file mode 100644 index 000000000..d10e72635 --- /dev/null +++ b/docker/dev/volume_mount.dockerfile @@ -0,0 +1,35 @@ +# syntax=docker/dockerfile:experimental +FROM rust:1.47-buster as rust + +ENV HOME=/home/root + +WORKDIR /app + +# Copy the source folders +COPY . ./ + +# Build for debug +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/app/target \ + cargo build +RUN --mount=type=cache,target=/app/target \ + cp target/debug/lemmy_server lemmy_server + +FROM peaceiris/mdbook:v0.3.7 as docs +WORKDIR /app +COPY docs ./docs +RUN mdbook build docs/ + +FROM ubuntu:20.10 + +# Install libpq for postgres and espeak +RUN apt-get update -y +RUN apt-get install -y libpq-dev espeak + +# Copy resources +COPY config/defaults.hjson /config/defaults.hjson +COPY --from=rust /app/lemmy_server /app/lemmy +COPY --from=docs /app/docs/book/ /app/documentation/ + +EXPOSE 8536 +CMD ["/app/lemmy"] diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index b70154cd7..3a17eefc7 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -1,25 +1,55 @@ -ARG RUST_BUILDER_IMAGE=ekidd/rust-musl-builder:stable +ARG RUST_BUILDER_IMAGE=ekidd/rust-musl-builder:1.47.0 -FROM $RUST_BUILDER_IMAGE as rust +# Cargo chef plan +FROM $RUST_BUILDER_IMAGE as planner +WORKDIR /app +RUN cargo install cargo-chef --version 0.1.6 + +# Copy dirs +COPY ./ ./ + +RUN sudo chown -R rust:rust . +RUN cargo chef prepare --recipe-path recipe.json + +# Cargo chef cache dependencies +FROM $RUST_BUILDER_IMAGE as cacher +ARG CARGO_BUILD_TARGET=x86_64-unknown-linux-musl +WORKDIR /app +RUN cargo install cargo-chef --version 0.1.6 +COPY --from=planner /app/recipe.json ./recipe.json +RUN sudo chown -R rust:rust . +RUN cargo chef cook --release --target ${CARGO_BUILD_TARGET} --recipe-path recipe.json + +# Build the project +FROM $RUST_BUILDER_IMAGE as builder ARG CARGO_BUILD_TARGET=x86_64-unknown-linux-musl ARG RUSTRELEASEDIR="release" -WORKDIR /app/server +WORKDIR /app + +# Copy over the cached dependencies +COPY --from=cacher /app/target target +COPY --from=cacher /home/rust/.cargo /home/rust/.cargo + +# Copy the rest of the dirs +COPY ./ ./ + RUN sudo chown -R rust:rust . -COPY . ./ RUN cargo build --release # reduce binary size RUN strip ./target/$CARGO_BUILD_TARGET/$RUSTRELEASEDIR/lemmy_server -RUN cp ./target/$CARGO_BUILD_TARGET/$RUSTRELEASEDIR/lemmy_server /app/server/ +RUN cp ./target/$CARGO_BUILD_TARGET/$RUSTRELEASEDIR/lemmy_server /app/lemmy_server +# Build the docs FROM $RUST_BUILDER_IMAGE as docs WORKDIR /app COPY --chown=rust:rust docs ./docs RUN mdbook build docs/ +# The alpine runner FROM alpine:3.12 as lemmy # Install libpq for postgres @@ -33,7 +63,7 @@ RUN adduser -D -s /bin/sh -u 1000 -G lemmy lemmy # Copy resources COPY --chown=lemmy:lemmy config/defaults.hjson /config/defaults.hjson -COPY --chown=lemmy:lemmy --from=rust /app/server/lemmy_server /app/lemmy +COPY --chown=lemmy:lemmy --from=builder /app/lemmy_server /app/lemmy COPY --chown=lemmy:lemmy --from=docs /app/docs/book/ /app/documentation/ RUN chown lemmy:lemmy /app/lemmy