From: Dessalines <dessalines@users.noreply.github.com>
Date: Mon, 23 Nov 2020 15:59:06 +0000 (-0500)
Subject: Trying out cargo chef and a travis docker image cache. (#1238)
X-Git-Url: http://these/git/%22https:/image.com/static/git-favicon.png?a=commitdiff_plain;h=d26a7ad337a640fdfd631938c017023a3587f10c;p=lemmy.git

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 <lpalmieri@truelayer.com>
---

diff --git a/.dockerignore b/.dockerignore
index b336eeeb..3a0f82b4 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 d10e7263..eba8e1ea 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 d99f4ddf..4531a1bd 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 00000000..ef68f1fd
--- /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 00000000..d10e7263
--- /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 b70154cd..3a17eefc 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