Browse Source
* WIP: Container building changes * Small updates - Updated to rust 1.73.0 - Updated crates - Updated documentation - Added a bake.sh script to make baking easier * Update GitHub Actions Workflow - Updated workflow to use qemu and buildx bake In the future i would like to extract the alpine based binaries and add them as artifacts to the release. * Address review remarks and small updates - Addressed review remarks - Added `podman-bake.sh` script to build Vaultwarden with podman - Updated README - Updated crates - Added `VW_VERSION` support - Added annotations - Updated web-vault to v2023.9.1pull/3994/head
Mathijs van Veluw
1 year ago
committed by
GitHub
43 changed files with 1744 additions and 2949 deletions
File diff suppressed because it is too large
@ -1 +1 @@ |
|||||
docker/amd64/Dockerfile |
docker/Dockerfile.debian |
@ -0,0 +1,28 @@ |
|||||
|
--- |
||||
|
vault_version: "v2023.9.1" |
||||
|
vault_image_digest: "sha256:ccf76db7406378b36cb937c1a3ca884448e32e7f82effd4d97b335cd725c75fd" |
||||
|
# Cross Compile Docker Helper Scripts v1.3.0 |
||||
|
# We use the linux/amd64 platform shell scripts since there is no difference between the different platform scripts |
||||
|
xx_image_digest: "sha256:c9609ace652bbe51dd4ce90e0af9d48a4590f1214246da5bc70e46f6dd586edc" |
||||
|
rust_version: 1.73.0 # Rust version to be used |
||||
|
debian_version: bookworm # Debian release name to be used |
||||
|
alpine_version: 3.18 # Alpine version to be used |
||||
|
# For which platforms/architectures will we try to build images |
||||
|
platforms: ["linux/amd64", "linux/arm64", "linux/arm/v7", "linux/arm/v6"] |
||||
|
# Determine the build images per OS/Arch |
||||
|
build_stage_image: |
||||
|
debian: |
||||
|
image: "docker.io/library/rust:{{rust_version}}-slim-{{debian_version}}" |
||||
|
platform: "$BUILDPLATFORM" |
||||
|
alpine: |
||||
|
image: "build_${TARGETARCH}${TARGETVARIANT}" |
||||
|
platform: "linux/amd64" # The Alpine build images only have linux/amd64 images |
||||
|
arch_image: |
||||
|
amd64: "ghcr.io/blackdex/rust-musl:x86_64-musl-stable-{{rust_version}}" |
||||
|
arm64: "ghcr.io/blackdex/rust-musl:aarch64-musl-stable-{{rust_version}}" |
||||
|
armv7: "ghcr.io/blackdex/rust-musl:armv7-musleabihf-stable-{{rust_version}}" |
||||
|
armv6: "ghcr.io/blackdex/rust-musl:arm-musleabi-stable-{{rust_version}}" |
||||
|
# The final image which will be used to distribute the container images |
||||
|
runtime_stage_image: |
||||
|
debian: "docker.io/library/debian:{{debian_version}}-slim" |
||||
|
alpine: "docker.io/library/alpine:{{alpine_version}}" |
@ -0,0 +1,160 @@ |
|||||
|
# syntax=docker/dockerfile:1 |
||||
|
|
||||
|
# This file was generated using a Jinja2 template. |
||||
|
# Please make your changes in `DockerSettings.yaml` or `Dockerfile.j2` and then `make` |
||||
|
# This will generate two Dockerfile's `Dockerfile.debian` and `Dockerfile.alpine` |
||||
|
|
||||
|
# Using multistage build: |
||||
|
# https://docs.docker.com/develop/develop-images/multistage-build/ |
||||
|
# https://whitfin.io/speeding-up-rust-docker-builds/ |
||||
|
|
||||
|
####################### VAULT BUILD IMAGE ####################### |
||||
|
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
||||
|
# Using the digest instead of the tag name provides better security, |
||||
|
# as the digest of an image is immutable, whereas a tag name can later |
||||
|
# be changed to point to a malicious image. |
||||
|
# |
||||
|
# To verify the current digest for a given tag name: |
||||
|
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
||||
|
# click the tag name to view the digest of the image it currently points to. |
||||
|
# - From the command line: |
||||
|
# $ docker pull docker.io/vaultwarden/web-vault:v2023.9.1 |
||||
|
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.9.1 |
||||
|
# [docker.io/vaultwarden/web-vault@sha256:ccf76db7406378b36cb937c1a3ca884448e32e7f82effd4d97b335cd725c75fd] |
||||
|
# |
||||
|
# - Conversely, to get the tag name from the digest: |
||||
|
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:ccf76db7406378b36cb937c1a3ca884448e32e7f82effd4d97b335cd725c75fd |
||||
|
# [docker.io/vaultwarden/web-vault:v2023.9.1] |
||||
|
# |
||||
|
FROM --platform=linux/amd64 docker.io/vaultwarden/web-vault@sha256:ccf76db7406378b36cb937c1a3ca884448e32e7f82effd4d97b335cd725c75fd as vault |
||||
|
|
||||
|
########################## ALPINE BUILD IMAGES ########################## |
||||
|
## NOTE: The Alpine Base Images do not support other platforms then linux/amd64 |
||||
|
## And for Alpine we define all build images here, they will only be loaded when actually used |
||||
|
FROM --platform=linux/amd64 ghcr.io/blackdex/rust-musl:x86_64-musl-stable-1.73.0 as build_amd64 |
||||
|
FROM --platform=linux/amd64 ghcr.io/blackdex/rust-musl:aarch64-musl-stable-1.73.0 as build_arm64 |
||||
|
FROM --platform=linux/amd64 ghcr.io/blackdex/rust-musl:armv7-musleabihf-stable-1.73.0 as build_armv7 |
||||
|
FROM --platform=linux/amd64 ghcr.io/blackdex/rust-musl:arm-musleabi-stable-1.73.0 as build_armv6 |
||||
|
|
||||
|
########################## BUILD IMAGE ########################## |
||||
|
# hadolint ignore=DL3006 |
||||
|
FROM --platform=linux/amd64 build_${TARGETARCH}${TARGETVARIANT} as build |
||||
|
ARG TARGETARCH |
||||
|
ARG TARGETVARIANT |
||||
|
ARG TARGETPLATFORM |
||||
|
|
||||
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
||||
|
|
||||
|
# Build time options to avoid dpkg warnings and help with reproducible builds. |
||||
|
ENV DEBIAN_FRONTEND=noninteractive \ |
||||
|
LANG=C.UTF-8 \ |
||||
|
TZ=UTC \ |
||||
|
TERM=xterm-256color \ |
||||
|
CARGO_HOME="/root/.cargo" \ |
||||
|
USER="root" \ |
||||
|
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
||||
|
# Debian Bookworm already contains libpq v15 |
||||
|
PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
||||
|
|
||||
|
|
||||
|
# Create CARGO_HOME folder and don't download rust docs |
||||
|
RUN mkdir -pv "${CARGO_HOME}" \ |
||||
|
&& rustup set profile minimal |
||||
|
|
||||
|
# Creates a dummy project used to grab dependencies |
||||
|
RUN USER=root cargo new --bin /app |
||||
|
WORKDIR /app |
||||
|
|
||||
|
# Shared variables across Debian and Alpine |
||||
|
RUN echo "export CARGO_TARGET=${RUST_MUSL_CROSS_TARGET}" >> /env-cargo && \ |
||||
|
# To be able to build the armv6 image with mimalloc we need to tell the linker to also look for libatomic |
||||
|
if [[ "${TARGETARCH}${TARGETVARIANT}" == "armv6" ]] ; then echo "export RUSTFLAGS='-Clink-arg=-latomic'" >> /env-cargo ; fi && \ |
||||
|
# Output the current contents of the file |
||||
|
cat /env-cargo |
||||
|
|
||||
|
# Enable MiMalloc to improve performance on Alpine builds |
||||
|
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
||||
|
|
||||
|
RUN source /env-cargo && \ |
||||
|
rustup target add "${CARGO_TARGET}" |
||||
|
|
||||
|
ARG CARGO_PROFILE=release |
||||
|
ARG VW_VERSION |
||||
|
|
||||
|
# Copies over *only* your manifests and build files |
||||
|
COPY ./Cargo.* ./ |
||||
|
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
||||
|
COPY ./build.rs ./build.rs |
||||
|
|
||||
|
# Builds your dependencies and removes the |
||||
|
# dummy project, except the target folder |
||||
|
# This folder contains the compiled dependencies |
||||
|
RUN source /env-cargo && \ |
||||
|
cargo build --features ${DB} --profile "${CARGO_PROFILE}" --target="${CARGO_TARGET}" && \ |
||||
|
find . -not -path "./target*" -delete |
||||
|
|
||||
|
# Copies the complete project |
||||
|
# To avoid copying unneeded files, use .dockerignore |
||||
|
COPY . . |
||||
|
|
||||
|
# Builds again, this time it will be the actual source files being build |
||||
|
RUN source /env-cargo && \ |
||||
|
# Make sure that we actually build the project by updating the src/main.rs timestamp |
||||
|
touch src/main.rs && \ |
||||
|
# Create a symlink to the binary target folder to easy copy the binary in the final stage |
||||
|
cargo build --features ${DB} --profile "${CARGO_PROFILE}" --target="${CARGO_TARGET}" && \ |
||||
|
if [[ "${CARGO_PROFILE}" == "dev" ]] ; then \ |
||||
|
ln -vfsr "/app/target/${CARGO_TARGET}/debug" /app/target/final ; \ |
||||
|
else \ |
||||
|
ln -vfsr "/app/target/${CARGO_TARGET}/${CARGO_PROFILE}" /app/target/final ; \ |
||||
|
fi |
||||
|
|
||||
|
|
||||
|
######################## RUNTIME IMAGE ######################## |
||||
|
# Create a new stage with a minimal image |
||||
|
# because we already have a binary built |
||||
|
# |
||||
|
# To build these images you need to have qemu binfmt support. |
||||
|
# See the following pages to help install these tools locally |
||||
|
# Ubuntu/Debian: https://wiki.debian.org/QemuUserEmulation |
||||
|
# Arch Linux: https://wiki.archlinux.org/title/QEMU#Chrooting_into_arm/arm64_environment_from_x86_64 |
||||
|
# |
||||
|
# Or use a Docker image which modifies your host system to support this. |
||||
|
# The GitHub Actions Workflow uses the same image as used below. |
||||
|
# See: https://github.com/tonistiigi/binfmt |
||||
|
# Usage: docker run --privileged --rm tonistiigi/binfmt --install arm64,arm |
||||
|
# To uninstall: docker run --privileged --rm tonistiigi/binfmt --uninstall 'qemu-*' |
||||
|
# |
||||
|
# We need to add `--platform` here, because of a podman bug: https://github.com/containers/buildah/issues/4742 |
||||
|
FROM --platform=$TARGETPLATFORM docker.io/library/alpine:3.18 |
||||
|
|
||||
|
ENV ROCKET_PROFILE="release" \ |
||||
|
ROCKET_ADDRESS=0.0.0.0 \ |
||||
|
ROCKET_PORT=80 \ |
||||
|
SSL_CERT_DIR=/etc/ssl/certs |
||||
|
|
||||
|
# Create data folder and Install needed libraries |
||||
|
RUN mkdir /data && \ |
||||
|
apk --no-cache add \ |
||||
|
ca-certificates \ |
||||
|
curl \ |
||||
|
openssl \ |
||||
|
tzdata |
||||
|
|
||||
|
VOLUME /data |
||||
|
EXPOSE 80 |
||||
|
EXPOSE 3012 |
||||
|
|
||||
|
# Copies the files from the context (Rocket.toml file and web-vault) |
||||
|
# and the binary from the "build" stage to the current stage |
||||
|
WORKDIR / |
||||
|
|
||||
|
COPY docker/healthcheck.sh /healthcheck.sh |
||||
|
COPY docker/start.sh /start.sh |
||||
|
|
||||
|
COPY --from=vault /web-vault ./web-vault |
||||
|
COPY --from=build /app/target/final/vaultwarden . |
||||
|
|
||||
|
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
||||
|
|
||||
|
CMD ["/start.sh"] |
@ -1,34 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
# The cross-built images have the build arch (`amd64`) embedded in the image |
|
||||
# manifest, rather than the target arch. For example: |
|
||||
# |
|
||||
# $ docker inspect vaultwarden/server:latest-armv7 | jq -r '.[]|.Architecture' |
|
||||
# amd64 |
|
||||
# |
|
||||
# Recent versions of Docker have started printing a warning when the image's |
|
||||
# claimed arch doesn't match the host arch. For example: |
|
||||
# |
|
||||
# WARNING: The requested image's platform (linux/amd64) does not match the |
|
||||
# detected host platform (linux/arm/v7) and no specific platform was requested |
|
||||
# |
|
||||
# The image still works fine, but the spurious warning creates confusion. |
|
||||
# |
|
||||
# Docker doesn't seem to provide a way to directly set the arch of an image |
|
||||
# at build time. To resolve the build vs. target arch discrepancy, we use |
|
||||
# Docker Buildx to build a new set of images with the correct target arch. |
|
||||
# |
|
||||
# Docker Buildx uses this Dockerfile to build an image for each requested |
|
||||
# platform. Since the Dockerfile basically consists of a single `FROM` |
|
||||
# instruction, we're effectively telling Buildx to build a platform-specific |
|
||||
# image by simply copying the existing cross-built image and setting the |
|
||||
# correct target arch as a side effect. |
|
||||
# |
|
||||
# References: |
|
||||
# |
|
||||
# - https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images |
|
||||
# - https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope |
|
||||
# - https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact |
|
||||
# |
|
||||
ARG LOCAL_REPO |
|
||||
ARG DOCKER_TAG |
|
||||
FROM ${LOCAL_REPO}:${DOCKER_TAG}-${TARGETARCH}${TARGETVARIANT} |
|
@ -0,0 +1,194 @@ |
|||||
|
# syntax=docker/dockerfile:1 |
||||
|
|
||||
|
# This file was generated using a Jinja2 template. |
||||
|
# Please make your changes in `DockerSettings.yaml` or `Dockerfile.j2` and then `make` |
||||
|
# This will generate two Dockerfile's `Dockerfile.debian` and `Dockerfile.alpine` |
||||
|
|
||||
|
# Using multistage build: |
||||
|
# https://docs.docker.com/develop/develop-images/multistage-build/ |
||||
|
# https://whitfin.io/speeding-up-rust-docker-builds/ |
||||
|
|
||||
|
####################### VAULT BUILD IMAGE ####################### |
||||
|
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
||||
|
# Using the digest instead of the tag name provides better security, |
||||
|
# as the digest of an image is immutable, whereas a tag name can later |
||||
|
# be changed to point to a malicious image. |
||||
|
# |
||||
|
# To verify the current digest for a given tag name: |
||||
|
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
||||
|
# click the tag name to view the digest of the image it currently points to. |
||||
|
# - From the command line: |
||||
|
# $ docker pull docker.io/vaultwarden/web-vault:v2023.9.1 |
||||
|
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.9.1 |
||||
|
# [docker.io/vaultwarden/web-vault@sha256:ccf76db7406378b36cb937c1a3ca884448e32e7f82effd4d97b335cd725c75fd] |
||||
|
# |
||||
|
# - Conversely, to get the tag name from the digest: |
||||
|
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:ccf76db7406378b36cb937c1a3ca884448e32e7f82effd4d97b335cd725c75fd |
||||
|
# [docker.io/vaultwarden/web-vault:v2023.9.1] |
||||
|
# |
||||
|
FROM --platform=linux/amd64 docker.io/vaultwarden/web-vault@sha256:ccf76db7406378b36cb937c1a3ca884448e32e7f82effd4d97b335cd725c75fd as vault |
||||
|
|
||||
|
########################## Cross Compile Docker Helper Scripts ########################## |
||||
|
## We use the linux/amd64 no matter which Build Platform, since these are all bash scripts |
||||
|
## And these bash scripts do not have any significant difference if at all |
||||
|
FROM --platform=linux/amd64 docker.io/tonistiigi/xx@sha256:c9609ace652bbe51dd4ce90e0af9d48a4590f1214246da5bc70e46f6dd586edc AS xx |
||||
|
|
||||
|
########################## BUILD IMAGE ########################## |
||||
|
# hadolint ignore=DL3006 |
||||
|
FROM --platform=$BUILDPLATFORM docker.io/library/rust:1.73.0-slim-bookworm as build |
||||
|
COPY --from=xx / / |
||||
|
ARG TARGETARCH |
||||
|
ARG TARGETVARIANT |
||||
|
ARG TARGETPLATFORM |
||||
|
|
||||
|
SHELL ["/bin/bash", "-o", "pipefail", "-c"] |
||||
|
|
||||
|
# Build time options to avoid dpkg warnings and help with reproducible builds. |
||||
|
ENV DEBIAN_FRONTEND=noninteractive \ |
||||
|
LANG=C.UTF-8 \ |
||||
|
TZ=UTC \ |
||||
|
TERM=xterm-256color \ |
||||
|
CARGO_HOME="/root/.cargo" \ |
||||
|
USER="root" |
||||
|
|
||||
|
# Install clang to get `xx-cargo` working |
||||
|
# Install pkg-config to allow amd64 builds to find all libraries |
||||
|
# Install git so build.rs can determine the correct version |
||||
|
# Install the libc cross packages based upon the debian-arch |
||||
|
RUN apt-get update && \ |
||||
|
apt-get install -y \ |
||||
|
--no-install-recommends \ |
||||
|
clang \ |
||||
|
pkg-config \ |
||||
|
git \ |
||||
|
"libc6-$(xx-info debian-arch)-cross" \ |
||||
|
"libc6-dev-$(xx-info debian-arch)-cross" \ |
||||
|
"linux-libc-dev-$(xx-info debian-arch)-cross" && \ |
||||
|
# Run xx-cargo early, since it sometimes seems to break when run at a later stage |
||||
|
echo "export CARGO_TARGET=$(xx-cargo --print-target-triple)" >> /env-cargo |
||||
|
|
||||
|
RUN xx-apt-get install -y \ |
||||
|
--no-install-recommends \ |
||||
|
gcc \ |
||||
|
libmariadb3 \ |
||||
|
libpq-dev \ |
||||
|
libpq5 \ |
||||
|
libssl-dev && \ |
||||
|
# Force install arch dependend mariadb dev packages |
||||
|
# Installing them the normal way breaks several other packages (again) |
||||
|
apt-get download "libmariadb-dev-compat:$(xx-info debian-arch)" "libmariadb-dev:$(xx-info debian-arch)" && \ |
||||
|
dpkg --force-all -i ./libmariadb-dev*.deb |
||||
|
|
||||
|
# Create CARGO_HOME folder and don't download rust docs |
||||
|
RUN mkdir -pv "${CARGO_HOME}" \ |
||||
|
&& rustup set profile minimal |
||||
|
|
||||
|
# Creates a dummy project used to grab dependencies |
||||
|
RUN USER=root cargo new --bin /app |
||||
|
WORKDIR /app |
||||
|
|
||||
|
# Environment variables for cargo across Debian and Alpine |
||||
|
RUN source /env-cargo && \ |
||||
|
if xx-info is-cross ; then \ |
||||
|
# We can't use xx-cargo since that uses clang, which doesn't work for our libraries. |
||||
|
# Because of this we generate the needed environment variables here which we can load in the needed steps. |
||||
|
echo "export CC_$(echo "${CARGO_TARGET}" | tr '[:upper:]' '[:lower:]' | tr - _)=/usr/bin/$(xx-info)-gcc" >> /env-cargo && \ |
||||
|
echo "export CARGO_TARGET_$(echo "${CARGO_TARGET}" | tr '[:lower:]' '[:upper:]' | tr - _)_LINKER=/usr/bin/$(xx-info)-gcc" >> /env-cargo && \ |
||||
|
echo "export PKG_CONFIG=/usr/bin/$(xx-info)-pkg-config" >> /env-cargo && \ |
||||
|
echo "export CROSS_COMPILE=1" >> /env-cargo && \ |
||||
|
echo "export OPENSSL_INCLUDE_DIR=/usr/include/$(xx-info)" >> /env-cargo && \ |
||||
|
echo "export OPENSSL_LIB_DIR=/usr/lib/$(xx-info)" >> /env-cargo ; \ |
||||
|
fi && \ |
||||
|
# Output the current contents of the file |
||||
|
cat /env-cargo |
||||
|
|
||||
|
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
||||
|
ARG DB=sqlite,mysql,postgresql |
||||
|
|
||||
|
RUN source /env-cargo && \ |
||||
|
rustup target add "${CARGO_TARGET}" |
||||
|
|
||||
|
ARG CARGO_PROFILE=release |
||||
|
ARG VW_VERSION |
||||
|
|
||||
|
# Copies over *only* your manifests and build files |
||||
|
COPY ./Cargo.* ./ |
||||
|
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
||||
|
COPY ./build.rs ./build.rs |
||||
|
|
||||
|
# Builds your dependencies and removes the |
||||
|
# dummy project, except the target folder |
||||
|
# This folder contains the compiled dependencies |
||||
|
RUN source /env-cargo && \ |
||||
|
cargo build --features ${DB} --profile "${CARGO_PROFILE}" --target="${CARGO_TARGET}" && \ |
||||
|
find . -not -path "./target*" -delete |
||||
|
|
||||
|
# Copies the complete project |
||||
|
# To avoid copying unneeded files, use .dockerignore |
||||
|
COPY . . |
||||
|
|
||||
|
# Builds again, this time it will be the actual source files being build |
||||
|
RUN source /env-cargo && \ |
||||
|
# Make sure that we actually build the project by updating the src/main.rs timestamp |
||||
|
touch src/main.rs && \ |
||||
|
# Create a symlink to the binary target folder to easy copy the binary in the final stage |
||||
|
cargo build --features ${DB} --profile "${CARGO_PROFILE}" --target="${CARGO_TARGET}" && \ |
||||
|
if [[ "${CARGO_PROFILE}" == "dev" ]] ; then \ |
||||
|
ln -vfsr "/app/target/${CARGO_TARGET}/debug" /app/target/final ; \ |
||||
|
else \ |
||||
|
ln -vfsr "/app/target/${CARGO_TARGET}/${CARGO_PROFILE}" /app/target/final ; \ |
||||
|
fi |
||||
|
|
||||
|
|
||||
|
######################## RUNTIME IMAGE ######################## |
||||
|
# Create a new stage with a minimal image |
||||
|
# because we already have a binary built |
||||
|
# |
||||
|
# To build these images you need to have qemu binfmt support. |
||||
|
# See the following pages to help install these tools locally |
||||
|
# Ubuntu/Debian: https://wiki.debian.org/QemuUserEmulation |
||||
|
# Arch Linux: https://wiki.archlinux.org/title/QEMU#Chrooting_into_arm/arm64_environment_from_x86_64 |
||||
|
# |
||||
|
# Or use a Docker image which modifies your host system to support this. |
||||
|
# The GitHub Actions Workflow uses the same image as used below. |
||||
|
# See: https://github.com/tonistiigi/binfmt |
||||
|
# Usage: docker run --privileged --rm tonistiigi/binfmt --install arm64,arm |
||||
|
# To uninstall: docker run --privileged --rm tonistiigi/binfmt --uninstall 'qemu-*' |
||||
|
# |
||||
|
# We need to add `--platform` here, because of a podman bug: https://github.com/containers/buildah/issues/4742 |
||||
|
FROM --platform=$TARGETPLATFORM docker.io/library/debian:bookworm-slim |
||||
|
|
||||
|
ENV ROCKET_PROFILE="release" \ |
||||
|
ROCKET_ADDRESS=0.0.0.0 \ |
||||
|
ROCKET_PORT=80 \ |
||||
|
DEBIAN_FRONTEND=noninteractive |
||||
|
|
||||
|
# Create data folder and Install needed libraries |
||||
|
RUN mkdir /data && \ |
||||
|
apt-get update && apt-get install -y \ |
||||
|
--no-install-recommends \ |
||||
|
ca-certificates \ |
||||
|
curl \ |
||||
|
libmariadb-dev-compat \ |
||||
|
libpq5 \ |
||||
|
openssl && \ |
||||
|
apt-get clean && \ |
||||
|
rm -rf /var/lib/apt/lists/* |
||||
|
|
||||
|
VOLUME /data |
||||
|
EXPOSE 80 |
||||
|
EXPOSE 3012 |
||||
|
|
||||
|
# Copies the files from the context (Rocket.toml file and web-vault) |
||||
|
# and the binary from the "build" stage to the current stage |
||||
|
WORKDIR / |
||||
|
|
||||
|
COPY docker/healthcheck.sh /healthcheck.sh |
||||
|
COPY docker/start.sh /start.sh |
||||
|
|
||||
|
COPY --from=vault /web-vault ./web-vault |
||||
|
COPY --from=build /app/target/final/vaultwarden . |
||||
|
|
||||
|
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
||||
|
|
||||
|
CMD ["/start.sh"] |
@ -1,15 +1,4 @@ |
|||||
OBJECTS := $(shell find ./ -mindepth 2 -name 'Dockerfile*') |
all: |
||||
|
./render_template Dockerfile.j2 '{"base": "debian"}' > Dockerfile.debian |
||||
all: $(OBJECTS) |
./render_template Dockerfile.j2 '{"base": "alpine"}' > Dockerfile.alpine |
||||
|
.PHONY: all |
||||
%/Dockerfile: Dockerfile.j2 render_template |
|
||||
./render_template "$<" "{\"target_file\":\"$@\"}" > "$@" |
|
||||
|
|
||||
%/Dockerfile.alpine: Dockerfile.j2 render_template |
|
||||
./render_template "$<" "{\"target_file\":\"$@\"}" > "$@" |
|
||||
|
|
||||
%/Dockerfile.buildkit: Dockerfile.j2 render_template |
|
||||
./render_template "$<" "{\"target_file\":\"$@\"}" > "$@" |
|
||||
|
|
||||
%/Dockerfile.buildkit.alpine: Dockerfile.j2 render_template |
|
||||
./render_template "$<" "{\"target_file\":\"$@\"}" > "$@" |
|
||||
|
@ -1,3 +1,183 @@ |
|||||
The arch-specific directory names follow the arch identifiers used by the Docker official images: |
# Vaultwarden Container Building |
||||
|
|
||||
https://github.com/docker-library/official-images/blob/master/README.md#architectures-other-than-amd64 |
To build and release new testing and stable releases of Vaultwarden we use `docker buildx bake`.<br> |
||||
|
This can be used locally by running the command yourself, but it is also used by GitHub Actions. |
||||
|
|
||||
|
This makes it easier for us to test and maintain the different architectures we provide.<br> |
||||
|
We also just have two Dockerfile's one for Debian and one for Alpine based images.<br> |
||||
|
With just these two files we can build both Debian and Alpine images for the following platforms: |
||||
|
- amd64 (linux/amd64) |
||||
|
- arm64 (linux/arm64) |
||||
|
- armv7 (linux/arm/v7) |
||||
|
- armv6 (linux/arm/v6) |
||||
|
|
||||
|
To build these containers you need to enable QEMU binfmt support to be able to run/emulate architectures which are different then your host.<br> |
||||
|
This ensures the container build process can run binaries from other architectures.<br> |
||||
|
|
||||
|
**NOTE**: Run all the examples below from the root of the repo.<br> |
||||
|
|
||||
|
|
||||
|
## How to install QEMU binfmt support |
||||
|
|
||||
|
This is different per host OS, but most support this in some way.<br> |
||||
|
|
||||
|
### Ubuntu/Debian |
||||
|
```bash |
||||
|
apt install binfmt-support qemu-user-static |
||||
|
``` |
||||
|
|
||||
|
### Arch Linux (others based upon it) |
||||
|
```bash |
||||
|
pacman -S qemu-user-static qemu-user-static-binfmt |
||||
|
``` |
||||
|
|
||||
|
### Fedora |
||||
|
```bash |
||||
|
dnf install qemu-user-static |
||||
|
``` |
||||
|
|
||||
|
### Others |
||||
|
There also is an option to use an other docker container to provide support for this. |
||||
|
```bash |
||||
|
# To install and activate |
||||
|
docker run --privileged --rm tonistiigi/binfmt --install arm64,arm |
||||
|
# To unistall |
||||
|
docker run --privileged --rm tonistiigi/binfmt --uninstall 'qemu-*' |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
## Single architecture container building |
||||
|
|
||||
|
You can build a container per supported architecture as long as you have QEMU binfmt support installed on your system.<br> |
||||
|
|
||||
|
```bash |
||||
|
# Default bake triggers a Debian build using the hosts architecture |
||||
|
docker buildx bake --file docker/docker-bake.hcl |
||||
|
|
||||
|
# Bake Debian ARM64 using a debug build |
||||
|
CARGO_PROFILE=dev \ |
||||
|
SOURCE_COMMIT="$(git rev-parse HEAD)" \ |
||||
|
docker buildx bake --file docker/docker-bake.hcl debian-arm64 |
||||
|
|
||||
|
# Bake Alpine ARMv6 as a release build |
||||
|
SOURCE_COMMIT="$(git rev-parse HEAD)" \ |
||||
|
docker buildx bake --file docker/docker-bake.hcl alpine-armv6 |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
## Local Multi Architecture container building |
||||
|
|
||||
|
Start the initialization, this only needs to be done once. |
||||
|
|
||||
|
```bash |
||||
|
# Create and use a new buildx builder instance which connects to the host network |
||||
|
docker buildx create --name vaultwarden --use --driver-opt network=host |
||||
|
|
||||
|
# Validate it runs |
||||
|
docker buildx inspect --bootstrap |
||||
|
|
||||
|
# Create a local container registry directly reachable on the localhost |
||||
|
docker run -d --name registry --network host registry:2 |
||||
|
``` |
||||
|
|
||||
|
After that is done, you should be able to build and push to the local registry.<br> |
||||
|
Use the following command with the modified variables to bake the Alpine images.<br> |
||||
|
Replace `alpine` with `debian` if you want to build the debian multi arch images. |
||||
|
|
||||
|
```bash |
||||
|
# Start a buildx bake using a debug build |
||||
|
CARGO_PROFILE=dev \ |
||||
|
SOURCE_COMMIT="$(git rev-parse HEAD)" \ |
||||
|
CONTAINER_REGISTRIES="localhost:5000/vaultwarden/server" \ |
||||
|
docker buildx bake --file docker/docker-bake.hcl alpine-multi |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
## Using the `bake.sh` script |
||||
|
|
||||
|
To make it a bit more easier to trigger a build, there also is a `bake.sh` script.<br> |
||||
|
This script calls `docker buildx bake` with all the right parameters and also generates the `SOURCE_COMMIT` and `SOURCE_VERSION` variables.<br> |
||||
|
This script can be called from both the repo root or within the docker directory. |
||||
|
|
||||
|
So, if you want to build a Multi Arch Alpine container pushing to your localhost registry you can run this from within the docker directory. (Just make sure you executed the initialization steps above first) |
||||
|
```bash |
||||
|
CONTAINER_REGISTRIES="localhost:5000/vaultwarden/server" \ |
||||
|
./bake.sh alpine-multi |
||||
|
``` |
||||
|
|
||||
|
Or if you want to just build a Debian container from the repo root, you can run this. |
||||
|
```bash |
||||
|
docker/bake.sh |
||||
|
``` |
||||
|
|
||||
|
You can append both `alpine` and `debian` with `-amd64`, `-arm64`, `-armv7` or `-armv6`, which will trigger a build for that specific platform.<br> |
||||
|
This will also append those values to the tag so you can see the builded container when running `docker images`. |
||||
|
|
||||
|
You can also append extra arguments after the target if you want. This can be useful for example to print what bake will use. |
||||
|
```bash |
||||
|
docker/bake.sh alpine-all --print |
||||
|
``` |
||||
|
|
||||
|
### Testing baked images |
||||
|
|
||||
|
To test these images you can run these images by using the correct tag and provide the platform.<br> |
||||
|
For example, after you have build an arm64 image via `./bake.sh debian-arm64` you can run: |
||||
|
```bash |
||||
|
docker run --rm -it \ |
||||
|
-e DISABLE_ADMIN_TOKEN=true \ |
||||
|
-e I_REALLY_WANT_VOLATILE_STORAGE=true \ |
||||
|
-p8080:80 --platform=linux/arm64 \ |
||||
|
vaultwarden/server:testing-arm64 |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
## Using the `podman-bake.sh` script |
||||
|
|
||||
|
To also make building easier using podman, there is a `podman-bake.sh` script.<br> |
||||
|
This script calls `podman buildx build` with the needed parameters and the same as `bake.sh`, it will generate some variables automatically.<br> |
||||
|
This script can be called from both the repo root or within the docker directory. |
||||
|
|
||||
|
**NOTE:** Unlike the `bake.sh` script, this only supports a single `CONTAINER_REGISTRIES`, and a single `BASE_TAGS` value, no comma separated values. It also only supports building separate architectures, no Multi Arch containers. |
||||
|
|
||||
|
To build an Alpine arm64 image with only sqlite support and mimalloc, run this: |
||||
|
```bash |
||||
|
DB="sqlite,enable_mimalloc" \ |
||||
|
./podman-bake.sh alpine-arm64 |
||||
|
``` |
||||
|
|
||||
|
Or if you want to just build a Debian container from the repo root, you can run this. |
||||
|
```bash |
||||
|
docker/podman-bake.sh |
||||
|
``` |
||||
|
|
||||
|
You can append extra arguments after the target if you want. This can be useful for example to disable cache like this. |
||||
|
```bash |
||||
|
./podman-bake.sh alpine-arm64 --no-cache |
||||
|
``` |
||||
|
|
||||
|
For the podman builds you can, just like the `bake.sh` script, also append the architecture to build for that specific platform.<br> |
||||
|
|
||||
|
### Testing podman builded images |
||||
|
|
||||
|
The command to start a podman built container is almost the same as for the docker/bake built containers. The images start with `localhost/`, so you need to prepend that. |
||||
|
|
||||
|
```bash |
||||
|
podman run --rm -it \ |
||||
|
-e DISABLE_ADMIN_TOKEN=true \ |
||||
|
-e I_REALLY_WANT_VOLATILE_STORAGE=true \ |
||||
|
-p8080:80 --platform=linux/arm64 \ |
||||
|
localhost/vaultwarden/server:testing-arm64 |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
## Variables supported |
||||
|
| Variable | default | description | |
||||
|
| --------------------- | ------------------ | ----------- | |
||||
|
| CARGO_PROFILE | null | Which cargo profile to use. `null` means what is defined in the Dockerfile | |
||||
|
| DB | null | Which `features` to build. `null` means what is defined in the Dockerfile | |
||||
|
| SOURCE_REPOSITORY_URL | null | The source repository form where this build is triggered | |
||||
|
| SOURCE_COMMIT | null | The commit hash of the current commit for this build | |
||||
|
| SOURCE_VERSION | null | The current exact tag of this commit, else the last tag and the first 8 chars of the source commit | |
||||
|
| BASE_TAGS | testing | Tags to be used. Can be a comma separated value like "latest,1.29.2" | |
||||
|
| CONTAINER_REGISTRIES | vaultwarden/server | Comma separated value of container registries. Like `ghcr.io/dani-garcia/vaultwarden,docker.io/vaultwarden/server` | |
||||
|
| VW_VERSION | null | To override the `SOURCE_VERSION` value. This is also used by the `build.rs` code for example | |
||||
|
@ -1,119 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/library/rust:1.72.0-bookworm as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Install build dependencies |
|
||||
RUN apt-get update \ |
|
||||
&& apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
libmariadb-dev \ |
|
||||
libpq-dev |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
ARG DB=sqlite,mysql,postgresql |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN cargo build --features ${DB} --release \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN cargo build --features ${DB} --release |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/library/debian:bookworm-slim |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 |
|
||||
|
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apt-get update && apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
libmariadb-dev-compat \ |
|
||||
libpq5 \ |
|
||||
openssl \ |
|
||||
&& apt-get clean \ |
|
||||
&& rm -rf /var/lib/apt/lists/* |
|
||||
|
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,116 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/blackdex/rust-musl:x86_64-musl-stable-1.72.0-openssl3 as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
|
||||
# Debian Bookworm already contains libpq v15 |
|
||||
ENV PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN rustup target add x86_64-unknown-linux-musl |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
# Enable MiMalloc to improve performance on Alpine builds |
|
||||
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN cargo build --features ${DB} --release --target=x86_64-unknown-linux-musl \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN cargo build --features ${DB} --release --target=x86_64-unknown-linux-musl |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/library/alpine:3.17 |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 \ |
|
||||
SSL_CERT_DIR=/etc/ssl/certs |
|
||||
|
|
||||
|
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apk add --no-cache \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
openssl \ |
|
||||
tzdata |
|
||||
|
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/x86_64-unknown-linux-musl/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,119 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/library/rust:1.72.0-bookworm as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Install build dependencies |
|
||||
RUN apt-get update \ |
|
||||
&& apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
libmariadb-dev \ |
|
||||
libpq-dev |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
ARG DB=sqlite,mysql,postgresql |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/library/debian:bookworm-slim |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 |
|
||||
|
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apt-get update && apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
libmariadb-dev-compat \ |
|
||||
libpq5 \ |
|
||||
openssl \ |
|
||||
&& apt-get clean \ |
|
||||
&& rm -rf /var/lib/apt/lists/* |
|
||||
|
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,116 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/blackdex/rust-musl:x86_64-musl-stable-1.72.0-openssl3 as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
|
||||
# Debian Bookworm already contains libpq v15 |
|
||||
ENV PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry rustup target add x86_64-unknown-linux-musl |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
# Enable MiMalloc to improve performance on Alpine builds |
|
||||
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=x86_64-unknown-linux-musl \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=x86_64-unknown-linux-musl |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/library/alpine:3.17 |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 \ |
|
||||
SSL_CERT_DIR=/etc/ssl/certs |
|
||||
|
|
||||
|
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apk add --no-cache \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
openssl \ |
|
||||
tzdata |
|
||||
|
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/x86_64-unknown-linux-musl/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,141 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/library/rust:1.72.0-bookworm as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Install build dependencies for the arm64 architecture |
|
||||
RUN dpkg --add-architecture arm64 \ |
|
||||
&& apt-get update \ |
|
||||
&& apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
gcc-aarch64-linux-gnu \ |
|
||||
libc6-dev:arm64 \ |
|
||||
linux-libc-dev:arm64 \ |
|
||||
libmariadb-dev:arm64 \ |
|
||||
libmariadb-dev-compat:arm64 \ |
|
||||
libmariadb3:arm64 \ |
|
||||
libpq-dev:arm64 \ |
|
||||
libpq5:arm64 \ |
|
||||
libssl-dev:arm64 \ |
|
||||
# |
|
||||
# Make sure cargo has the right target config |
|
||||
&& echo '[target.aarch64-unknown-linux-gnu]' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'linker = "aarch64-linux-gnu-gcc"' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'rustflags = ["-L/usr/lib/aarch64-linux-gnu"]' >> "${CARGO_HOME}/config" |
|
||||
|
|
||||
# Set arm specific environment values |
|
||||
ENV CC_aarch64_unknown_linux_gnu="/usr/bin/aarch64-linux-gnu-gcc" \ |
|
||||
CROSS_COMPILE="1" \ |
|
||||
OPENSSL_INCLUDE_DIR="/usr/include/aarch64-linux-gnu" \ |
|
||||
OPENSSL_LIB_DIR="/usr/lib/aarch64-linux-gnu" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN rustup target add aarch64-unknown-linux-gnu |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
ARG DB=sqlite,mysql,postgresql |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN cargo build --features ${DB} --release --target=aarch64-unknown-linux-gnu \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN cargo build --features ${DB} --release --target=aarch64-unknown-linux-gnu |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/aarch64-debian:bookworm |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 |
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apt-get update && apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
libmariadb-dev-compat \ |
|
||||
libpq5 \ |
|
||||
openssl \ |
|
||||
&& apt-get clean \ |
|
||||
&& rm -rf /var/lib/apt/lists/* |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/aarch64-unknown-linux-gnu/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,118 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/blackdex/rust-musl:aarch64-musl-stable-1.72.0-openssl3 as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
|
||||
# Debian Bookworm already contains libpq v15 |
|
||||
ENV PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN rustup target add aarch64-unknown-linux-musl |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
# Enable MiMalloc to improve performance on Alpine builds |
|
||||
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN cargo build --features ${DB} --release --target=aarch64-unknown-linux-musl \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN cargo build --features ${DB} --release --target=aarch64-unknown-linux-musl |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/aarch64-alpine:3.17 |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 \ |
|
||||
SSL_CERT_DIR=/etc/ssl/certs |
|
||||
|
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apk add --no-cache \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
openssl \ |
|
||||
tzdata |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/aarch64-unknown-linux-musl/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,141 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/library/rust:1.72.0-bookworm as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Install build dependencies for the arm64 architecture |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry dpkg --add-architecture arm64 \ |
|
||||
&& apt-get update \ |
|
||||
&& apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
gcc-aarch64-linux-gnu \ |
|
||||
libc6-dev:arm64 \ |
|
||||
linux-libc-dev:arm64 \ |
|
||||
libmariadb-dev:arm64 \ |
|
||||
libmariadb-dev-compat:arm64 \ |
|
||||
libmariadb3:arm64 \ |
|
||||
libpq-dev:arm64 \ |
|
||||
libpq5:arm64 \ |
|
||||
libssl-dev:arm64 \ |
|
||||
# |
|
||||
# Make sure cargo has the right target config |
|
||||
&& echo '[target.aarch64-unknown-linux-gnu]' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'linker = "aarch64-linux-gnu-gcc"' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'rustflags = ["-L/usr/lib/aarch64-linux-gnu"]' >> "${CARGO_HOME}/config" |
|
||||
|
|
||||
# Set arm specific environment values |
|
||||
ENV CC_aarch64_unknown_linux_gnu="/usr/bin/aarch64-linux-gnu-gcc" \ |
|
||||
CROSS_COMPILE="1" \ |
|
||||
OPENSSL_INCLUDE_DIR="/usr/include/aarch64-linux-gnu" \ |
|
||||
OPENSSL_LIB_DIR="/usr/lib/aarch64-linux-gnu" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry rustup target add aarch64-unknown-linux-gnu |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
ARG DB=sqlite,mysql,postgresql |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=aarch64-unknown-linux-gnu \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=aarch64-unknown-linux-gnu |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/aarch64-debian:bookworm |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 |
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apt-get update && apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
libmariadb-dev-compat \ |
|
||||
libpq5 \ |
|
||||
openssl \ |
|
||||
&& apt-get clean \ |
|
||||
&& rm -rf /var/lib/apt/lists/* |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/aarch64-unknown-linux-gnu/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,118 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/blackdex/rust-musl:aarch64-musl-stable-1.72.0-openssl3 as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
|
||||
# Debian Bookworm already contains libpq v15 |
|
||||
ENV PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry rustup target add aarch64-unknown-linux-musl |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
# Enable MiMalloc to improve performance on Alpine builds |
|
||||
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=aarch64-unknown-linux-musl \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=aarch64-unknown-linux-musl |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/aarch64-alpine:3.17 |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 \ |
|
||||
SSL_CERT_DIR=/etc/ssl/certs |
|
||||
|
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apk add --no-cache \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
openssl \ |
|
||||
tzdata |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/aarch64-unknown-linux-musl/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,141 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/library/rust:1.72.0-bookworm as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Install build dependencies for the armel architecture |
|
||||
RUN dpkg --add-architecture armel \ |
|
||||
&& apt-get update \ |
|
||||
&& apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
gcc-arm-linux-gnueabi \ |
|
||||
libc6-dev:armel \ |
|
||||
linux-libc-dev:armel \ |
|
||||
libmariadb-dev:armel \ |
|
||||
libmariadb-dev-compat:armel \ |
|
||||
libmariadb3:armel \ |
|
||||
libpq-dev:armel \ |
|
||||
libpq5:armel \ |
|
||||
libssl-dev:armel \ |
|
||||
# |
|
||||
# Make sure cargo has the right target config |
|
||||
&& echo '[target.arm-unknown-linux-gnueabi]' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'linker = "arm-linux-gnueabi-gcc"' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'rustflags = ["-L/usr/lib/arm-linux-gnueabi"]' >> "${CARGO_HOME}/config" |
|
||||
|
|
||||
# Set arm specific environment values |
|
||||
ENV CC_arm_unknown_linux_gnueabi="/usr/bin/arm-linux-gnueabi-gcc" \ |
|
||||
CROSS_COMPILE="1" \ |
|
||||
OPENSSL_INCLUDE_DIR="/usr/include/arm-linux-gnueabi" \ |
|
||||
OPENSSL_LIB_DIR="/usr/lib/arm-linux-gnueabi" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN rustup target add arm-unknown-linux-gnueabi |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
ARG DB=sqlite,mysql,postgresql |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN cargo build --features ${DB} --release --target=arm-unknown-linux-gnueabi \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN cargo build --features ${DB} --release --target=arm-unknown-linux-gnueabi |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/rpi-debian:bookworm |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 |
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apt-get update && apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
libmariadb-dev-compat \ |
|
||||
libpq5 \ |
|
||||
openssl \ |
|
||||
&& apt-get clean \ |
|
||||
&& rm -rf /var/lib/apt/lists/* |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/arm-unknown-linux-gnueabi/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,120 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/blackdex/rust-musl:arm-musleabi-stable-1.72.0-openssl3 as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
|
||||
# Debian Bookworm already contains libpq v15 |
|
||||
ENV PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
|
||||
# To be able to build the armv6 image with mimalloc we need to tell the linker to also look for libatomic |
|
||||
ENV RUSTFLAGS='-Clink-arg=-latomic' |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN rustup target add arm-unknown-linux-musleabi |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
# Enable MiMalloc to improve performance on Alpine builds |
|
||||
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN cargo build --features ${DB} --release --target=arm-unknown-linux-musleabi \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN cargo build --features ${DB} --release --target=arm-unknown-linux-musleabi |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/rpi-alpine:3.17 |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 \ |
|
||||
SSL_CERT_DIR=/etc/ssl/certs |
|
||||
|
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apk add --no-cache \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
openssl \ |
|
||||
tzdata |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/arm-unknown-linux-musleabi/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,141 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/library/rust:1.72.0-bookworm as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Install build dependencies for the armel architecture |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry dpkg --add-architecture armel \ |
|
||||
&& apt-get update \ |
|
||||
&& apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
gcc-arm-linux-gnueabi \ |
|
||||
libc6-dev:armel \ |
|
||||
linux-libc-dev:armel \ |
|
||||
libmariadb-dev:armel \ |
|
||||
libmariadb-dev-compat:armel \ |
|
||||
libmariadb3:armel \ |
|
||||
libpq-dev:armel \ |
|
||||
libpq5:armel \ |
|
||||
libssl-dev:armel \ |
|
||||
# |
|
||||
# Make sure cargo has the right target config |
|
||||
&& echo '[target.arm-unknown-linux-gnueabi]' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'linker = "arm-linux-gnueabi-gcc"' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'rustflags = ["-L/usr/lib/arm-linux-gnueabi"]' >> "${CARGO_HOME}/config" |
|
||||
|
|
||||
# Set arm specific environment values |
|
||||
ENV CC_arm_unknown_linux_gnueabi="/usr/bin/arm-linux-gnueabi-gcc" \ |
|
||||
CROSS_COMPILE="1" \ |
|
||||
OPENSSL_INCLUDE_DIR="/usr/include/arm-linux-gnueabi" \ |
|
||||
OPENSSL_LIB_DIR="/usr/lib/arm-linux-gnueabi" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry rustup target add arm-unknown-linux-gnueabi |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
ARG DB=sqlite,mysql,postgresql |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=arm-unknown-linux-gnueabi \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=arm-unknown-linux-gnueabi |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/rpi-debian:bookworm |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 |
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apt-get update && apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
libmariadb-dev-compat \ |
|
||||
libpq5 \ |
|
||||
openssl \ |
|
||||
&& apt-get clean \ |
|
||||
&& rm -rf /var/lib/apt/lists/* |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/arm-unknown-linux-gnueabi/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,120 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/blackdex/rust-musl:arm-musleabi-stable-1.72.0-openssl3 as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
|
||||
# Debian Bookworm already contains libpq v15 |
|
||||
ENV PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
|
||||
# To be able to build the armv6 image with mimalloc we need to tell the linker to also look for libatomic |
|
||||
ENV RUSTFLAGS='-Clink-arg=-latomic' |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry rustup target add arm-unknown-linux-musleabi |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
# Enable MiMalloc to improve performance on Alpine builds |
|
||||
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=arm-unknown-linux-musleabi \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=arm-unknown-linux-musleabi |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/rpi-alpine:3.17 |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 \ |
|
||||
SSL_CERT_DIR=/etc/ssl/certs |
|
||||
|
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apk add --no-cache \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
openssl \ |
|
||||
tzdata |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/arm-unknown-linux-musleabi/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,141 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/library/rust:1.72.0-bookworm as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Install build dependencies for the armhf architecture |
|
||||
RUN dpkg --add-architecture armhf \ |
|
||||
&& apt-get update \ |
|
||||
&& apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
gcc-arm-linux-gnueabihf \ |
|
||||
libc6-dev:armhf \ |
|
||||
linux-libc-dev:armhf \ |
|
||||
libmariadb-dev:armhf \ |
|
||||
libmariadb-dev-compat:armhf \ |
|
||||
libmariadb3:armhf \ |
|
||||
libpq-dev:armhf \ |
|
||||
libpq5:armhf \ |
|
||||
libssl-dev:armhf \ |
|
||||
# |
|
||||
# Make sure cargo has the right target config |
|
||||
&& echo '[target.armv7-unknown-linux-gnueabihf]' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'linker = "arm-linux-gnueabihf-gcc"' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'rustflags = ["-L/usr/lib/arm-linux-gnueabihf"]' >> "${CARGO_HOME}/config" |
|
||||
|
|
||||
# Set arm specific environment values |
|
||||
ENV CC_armv7_unknown_linux_gnueabihf="/usr/bin/arm-linux-gnueabihf-gcc" \ |
|
||||
CROSS_COMPILE="1" \ |
|
||||
OPENSSL_INCLUDE_DIR="/usr/include/arm-linux-gnueabihf" \ |
|
||||
OPENSSL_LIB_DIR="/usr/lib/arm-linux-gnueabihf" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN rustup target add armv7-unknown-linux-gnueabihf |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
ARG DB=sqlite,mysql,postgresql |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN cargo build --features ${DB} --release --target=armv7-unknown-linux-gnueabihf \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN cargo build --features ${DB} --release --target=armv7-unknown-linux-gnueabihf |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/armv7hf-debian:bookworm |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 |
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apt-get update && apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
libmariadb-dev-compat \ |
|
||||
libpq5 \ |
|
||||
openssl \ |
|
||||
&& apt-get clean \ |
|
||||
&& rm -rf /var/lib/apt/lists/* |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/armv7-unknown-linux-gnueabihf/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,118 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/blackdex/rust-musl:armv7-musleabihf-stable-1.72.0-openssl3 as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
|
||||
# Debian Bookworm already contains libpq v15 |
|
||||
ENV PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN rustup target add armv7-unknown-linux-musleabihf |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
# Enable MiMalloc to improve performance on Alpine builds |
|
||||
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN cargo build --features ${DB} --release --target=armv7-unknown-linux-musleabihf \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN cargo build --features ${DB} --release --target=armv7-unknown-linux-musleabihf |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/armv7hf-alpine:3.17 |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 \ |
|
||||
SSL_CERT_DIR=/etc/ssl/certs |
|
||||
|
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apk add --no-cache \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
openssl \ |
|
||||
tzdata |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/armv7-unknown-linux-musleabihf/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,141 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/library/rust:1.72.0-bookworm as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Install build dependencies for the armhf architecture |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry dpkg --add-architecture armhf \ |
|
||||
&& apt-get update \ |
|
||||
&& apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
gcc-arm-linux-gnueabihf \ |
|
||||
libc6-dev:armhf \ |
|
||||
linux-libc-dev:armhf \ |
|
||||
libmariadb-dev:armhf \ |
|
||||
libmariadb-dev-compat:armhf \ |
|
||||
libmariadb3:armhf \ |
|
||||
libpq-dev:armhf \ |
|
||||
libpq5:armhf \ |
|
||||
libssl-dev:armhf \ |
|
||||
# |
|
||||
# Make sure cargo has the right target config |
|
||||
&& echo '[target.armv7-unknown-linux-gnueabihf]' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'linker = "arm-linux-gnueabihf-gcc"' >> "${CARGO_HOME}/config" \ |
|
||||
&& echo 'rustflags = ["-L/usr/lib/arm-linux-gnueabihf"]' >> "${CARGO_HOME}/config" |
|
||||
|
|
||||
# Set arm specific environment values |
|
||||
ENV CC_armv7_unknown_linux_gnueabihf="/usr/bin/arm-linux-gnueabihf-gcc" \ |
|
||||
CROSS_COMPILE="1" \ |
|
||||
OPENSSL_INCLUDE_DIR="/usr/include/arm-linux-gnueabihf" \ |
|
||||
OPENSSL_LIB_DIR="/usr/lib/arm-linux-gnueabihf" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry rustup target add armv7-unknown-linux-gnueabihf |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
ARG DB=sqlite,mysql,postgresql |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=armv7-unknown-linux-gnueabihf \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=armv7-unknown-linux-gnueabihf |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/armv7hf-debian:bookworm |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 |
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apt-get update && apt-get install -y \ |
|
||||
--no-install-recommends \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
libmariadb-dev-compat \ |
|
||||
libpq5 \ |
|
||||
openssl \ |
|
||||
&& apt-get clean \ |
|
||||
&& rm -rf /var/lib/apt/lists/* |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/armv7-unknown-linux-gnueabihf/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -1,118 +0,0 @@ |
|||||
# syntax=docker/dockerfile:1 |
|
||||
|
|
||||
# This file was generated using a Jinja2 template. |
|
||||
# Please make your changes in `Dockerfile.j2` and then `make` the individual Dockerfiles. |
|
||||
# Using multistage build: |
|
||||
# https://docs.docker.com/develop/develop-images/multistage-build/ |
|
||||
# https://whitfin.io/speeding-up-rust-docker-builds/ |
|
||||
####################### VAULT BUILD IMAGE ####################### |
|
||||
# The web-vault digest specifies a particular web-vault build on Docker Hub. |
|
||||
# Using the digest instead of the tag name provides better security, |
|
||||
# as the digest of an image is immutable, whereas a tag name can later |
|
||||
# be changed to point to a malicious image. |
|
||||
# |
|
||||
# To verify the current digest for a given tag name: |
|
||||
# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, |
|
||||
# click the tag name to view the digest of the image it currently points to. |
|
||||
# - From the command line: |
|
||||
# $ docker pull docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# $ docker image inspect --format "{{.RepoDigests}}" docker.io/vaultwarden/web-vault:v2023.8.2 |
|
||||
# [docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252] |
|
||||
# |
|
||||
# - Conversely, to get the tag name from the digest: |
|
||||
# $ docker image inspect --format "{{.RepoTags}}" docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 |
|
||||
# [docker.io/vaultwarden/web-vault:v2023.8.2] |
|
||||
# |
|
||||
FROM docker.io/vaultwarden/web-vault@sha256:b361e79309ef2c4368f880f350166daade41eb0927a9adf376c76e3713027252 as vault |
|
||||
|
|
||||
########################## BUILD IMAGE ########################## |
|
||||
FROM docker.io/blackdex/rust-musl:armv7-musleabihf-stable-1.72.0-openssl3 as build |
|
||||
|
|
||||
# Build time options to avoid dpkg warnings and help with reproducible builds. |
|
||||
ENV DEBIAN_FRONTEND=noninteractive \ |
|
||||
LANG=C.UTF-8 \ |
|
||||
TZ=UTC \ |
|
||||
TERM=xterm-256color \ |
|
||||
CARGO_HOME="/root/.cargo" \ |
|
||||
REGISTRIES_CRATES_IO_PROTOCOL=sparse \ |
|
||||
USER="root" |
|
||||
|
|
||||
# Create CARGO_HOME folder and don't download rust docs |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry mkdir -pv "${CARGO_HOME}" \ |
|
||||
&& rustup set profile minimal |
|
||||
|
|
||||
# Use PostgreSQL v15 during Alpine/MUSL builds instead of the default v11 |
|
||||
# Debian Bookworm already contains libpq v15 |
|
||||
ENV PQ_LIB_DIR="/usr/local/musl/pq15/lib" |
|
||||
|
|
||||
# Creates a dummy project used to grab dependencies |
|
||||
RUN USER=root cargo new --bin /app |
|
||||
WORKDIR /app |
|
||||
|
|
||||
# Copies over *only* your manifests and build files |
|
||||
COPY ./Cargo.* ./ |
|
||||
COPY ./rust-toolchain.toml ./rust-toolchain.toml |
|
||||
COPY ./build.rs ./build.rs |
|
||||
|
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry rustup target add armv7-unknown-linux-musleabihf |
|
||||
|
|
||||
# Configure the DB ARG as late as possible to not invalidate the cached layers above |
|
||||
# Enable MiMalloc to improve performance on Alpine builds |
|
||||
ARG DB=sqlite,mysql,postgresql,enable_mimalloc |
|
||||
|
|
||||
# Builds your dependencies and removes the |
|
||||
# dummy project, except the target folder |
|
||||
# This folder contains the compiled dependencies |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=armv7-unknown-linux-musleabihf \ |
|
||||
&& find . -not -path "./target*" -delete |
|
||||
|
|
||||
# Copies the complete project |
|
||||
# To avoid copying unneeded files, use .dockerignore |
|
||||
COPY . . |
|
||||
|
|
||||
# Make sure that we actually build the project |
|
||||
RUN touch src/main.rs |
|
||||
|
|
||||
# Builds again, this time it'll just be |
|
||||
# your actual source files being built |
|
||||
RUN --mount=type=cache,target=/root/.cargo/git --mount=type=cache,target=/root/.cargo/registry cargo build --features ${DB} --release --target=armv7-unknown-linux-musleabihf |
|
||||
|
|
||||
######################## RUNTIME IMAGE ######################## |
|
||||
# Create a new stage with a minimal image |
|
||||
# because we already have a binary built |
|
||||
FROM docker.io/balenalib/armv7hf-alpine:3.17 |
|
||||
|
|
||||
ENV ROCKET_PROFILE="release" \ |
|
||||
ROCKET_ADDRESS=0.0.0.0 \ |
|
||||
ROCKET_PORT=80 \ |
|
||||
SSL_CERT_DIR=/etc/ssl/certs |
|
||||
|
|
||||
|
|
||||
RUN [ "cross-build-start" ] |
|
||||
|
|
||||
# Create data folder and Install needed libraries |
|
||||
RUN mkdir /data \ |
|
||||
&& apk add --no-cache \ |
|
||||
ca-certificates \ |
|
||||
curl \ |
|
||||
openssl \ |
|
||||
tzdata |
|
||||
|
|
||||
RUN [ "cross-build-end" ] |
|
||||
|
|
||||
VOLUME /data |
|
||||
EXPOSE 80 |
|
||||
EXPOSE 3012 |
|
||||
|
|
||||
# Copies the files from the context (Rocket.toml file and web-vault) |
|
||||
# and the binary from the "build" stage to the current stage |
|
||||
WORKDIR / |
|
||||
COPY --from=vault /web-vault ./web-vault |
|
||||
COPY --from=build /app/target/armv7-unknown-linux-musleabihf/release/vaultwarden . |
|
||||
|
|
||||
COPY docker/healthcheck.sh /healthcheck.sh |
|
||||
COPY docker/start.sh /start.sh |
|
||||
|
|
||||
HEALTHCHECK --interval=60s --timeout=10s CMD ["/healthcheck.sh"] |
|
||||
|
|
||||
CMD ["/start.sh"] |
|
@ -0,0 +1,15 @@ |
|||||
|
#!/usr/bin/env bash |
||||
|
|
||||
|
# Determine the basedir of this script. |
||||
|
# It should be located in the same directory as the docker-bake.hcl |
||||
|
# This ensures you can run this script from both inside and outside of the docker directory |
||||
|
BASEDIR=$(RL=$(readlink -n "$0"); SP="${RL:-$0}"; dirname "$(cd "$(dirname "${SP}")" || exit; pwd)/$(basename "${SP}")") |
||||
|
|
||||
|
# Load build env's |
||||
|
source "${BASEDIR}/bake_env.sh" |
||||
|
|
||||
|
# Be verbose on what is being executed |
||||
|
set -x |
||||
|
|
||||
|
# Make sure we set the context to `..` so it will go up one directory |
||||
|
docker buildx bake --progress plain --set "*.context=${BASEDIR}/.." -f "${BASEDIR}/docker-bake.hcl" "$@" |
@ -0,0 +1,33 @@ |
|||||
|
#!/usr/bin/env bash |
||||
|
|
||||
|
# If SOURCE_COMMIT is provided via env skip this |
||||
|
if [ -z "${SOURCE_COMMIT+x}" ]; then |
||||
|
SOURCE_COMMIT="$(git rev-parse HEAD)" |
||||
|
fi |
||||
|
|
||||
|
# If VW_VERSION is provided via env use it as SOURCE_VERSION |
||||
|
# Else define it using git |
||||
|
if [[ -n "${VW_VERSION}" ]]; then |
||||
|
SOURCE_VERSION="${VW_VERSION}" |
||||
|
else |
||||
|
GIT_EXACT_TAG="$(git describe --tags --abbrev=0 --exact-match 2>/dev/null)" |
||||
|
if [[ -n "${GIT_EXACT_TAG}" ]]; then |
||||
|
SOURCE_VERSION="${GIT_EXACT_TAG}" |
||||
|
else |
||||
|
GIT_LAST_TAG="$(git describe --tags --abbrev=0)" |
||||
|
SOURCE_VERSION="${GIT_LAST_TAG}-${SOURCE_COMMIT:0:8}" |
||||
|
GIT_BRANCH="$(git rev-parse --abbrev-ref HEAD)" |
||||
|
case "${GIT_BRANCH}" in |
||||
|
main|master|HEAD) |
||||
|
# Do not add the branch name for these branches |
||||
|
;; |
||||
|
*) |
||||
|
SOURCE_VERSION="${SOURCE_VERSION} (${GIT_BRANCH})" |
||||
|
;; |
||||
|
esac |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
# Export the rendered variables above so bake will use them |
||||
|
export SOURCE_COMMIT |
||||
|
export SOURCE_VERSION |
@ -0,0 +1,229 @@ |
|||||
|
// ==== Baking Variables ==== |
||||
|
|
||||
|
// Set which cargo profile to use, dev or release for example |
||||
|
// Use the value provided in the Dockerfile as default |
||||
|
variable "CARGO_PROFILE" { |
||||
|
default = null |
||||
|
} |
||||
|
|
||||
|
// Set which DB's (features) to enable |
||||
|
// Use the value provided in the Dockerfile as default |
||||
|
variable "DB" { |
||||
|
default = null |
||||
|
} |
||||
|
|
||||
|
// The repository this build was triggered from |
||||
|
variable "SOURCE_REPOSITORY_URL" { |
||||
|
default = null |
||||
|
} |
||||
|
|
||||
|
// The commit hash of of the current commit this build was triggered on |
||||
|
variable "SOURCE_COMMIT" { |
||||
|
default = null |
||||
|
} |
||||
|
|
||||
|
// The version of this build |
||||
|
// Typically the current exact tag of this commit, |
||||
|
// else the last tag and the first 8 characters of the source commit |
||||
|
variable "SOURCE_VERSION" { |
||||
|
default = null |
||||
|
} |
||||
|
|
||||
|
// This can be used to overwrite SOURCE_VERSION |
||||
|
// It will be used during the build.rs building stage |
||||
|
variable "VW_VERSION" { |
||||
|
default = null |
||||
|
} |
||||
|
|
||||
|
// The base tag(s) to use |
||||
|
// This can be a comma separated value like "testing,1.29.2" |
||||
|
variable "BASE_TAGS" { |
||||
|
default = "testing" |
||||
|
} |
||||
|
|
||||
|
// Which container registries should be used for the tagging |
||||
|
// This can be a comma separated value |
||||
|
// Use a full URI like `ghcr.io/dani-garcia/vaultwarden,docker.io/vaultwarden/server` |
||||
|
variable "CONTAINER_REGISTRIES" { |
||||
|
default = "vaultwarden/server" |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// ==== Baking Groups ==== |
||||
|
|
||||
|
group "default" { |
||||
|
targets = ["debian"] |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// ==== Shared Baking ==== |
||||
|
function "labels" { |
||||
|
params = [] |
||||
|
result = { |
||||
|
"org.opencontainers.image.description" = "Unofficial Bitwarden compatible server written in Rust - ${SOURCE_VERSION}" |
||||
|
"org.opencontainers.image.licenses" = "AGPL-3.0-only" |
||||
|
"org.opencontainers.image.documentation" = "https://github.com/dani-garcia/vaultwarden/wiki" |
||||
|
"org.opencontainers.image.url" = "https://github.com/dani-garcia/vaultwarden" |
||||
|
"org.opencontainers.image.created" = "${formatdate("YYYY-MM-DD'T'hh:mm:ssZZZZZ", timestamp())}" |
||||
|
"org.opencontainers.image.source" = "${SOURCE_REPOSITORY_URL}" |
||||
|
"org.opencontainers.image.revision" = "${SOURCE_COMMIT}" |
||||
|
"org.opencontainers.image.version" = "${SOURCE_VERSION}" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
target "_default_attributes" { |
||||
|
labels = labels() |
||||
|
args = { |
||||
|
DB = "${DB}" |
||||
|
CARGO_PROFILE = "${CARGO_PROFILE}" |
||||
|
VW_VERSION = "${VW_VERSION}" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// ==== Debian Baking ==== |
||||
|
|
||||
|
// Default Debian target, will build a container using the hosts platform architecture |
||||
|
target "debian" { |
||||
|
inherits = ["_default_attributes"] |
||||
|
dockerfile = "docker/Dockerfile.debian" |
||||
|
tags = generate_tags("", platform_tag()) |
||||
|
output = [join(",", flatten([["type=docker"], image_index_annotations()]))] |
||||
|
} |
||||
|
|
||||
|
// Multi Platform target, will build one tagged manifest with all supported architectures |
||||
|
// This is mainly used by GitHub Actions to build and push new containers |
||||
|
target "debian-multi" { |
||||
|
inherits = ["debian"] |
||||
|
platforms = ["linux/amd64", "linux/arm64", "linux/arm/v7", "linux/arm/v6"] |
||||
|
tags = generate_tags("", "") |
||||
|
output = [join(",", flatten([["type=registry"], image_index_annotations()]))] |
||||
|
} |
||||
|
|
||||
|
// Per platform targets, to individually test building per platform locally |
||||
|
target "debian-amd64" { |
||||
|
inherits = ["debian"] |
||||
|
platforms = ["linux/amd64"] |
||||
|
tags = generate_tags("", "-amd64") |
||||
|
} |
||||
|
|
||||
|
target "debian-arm64" { |
||||
|
inherits = ["debian"] |
||||
|
platforms = ["linux/arm64"] |
||||
|
tags = generate_tags("", "-arm64") |
||||
|
} |
||||
|
|
||||
|
target "debian-armv7" { |
||||
|
inherits = ["debian"] |
||||
|
platforms = ["linux/arm/v7"] |
||||
|
tags = generate_tags("", "-armv7") |
||||
|
} |
||||
|
|
||||
|
target "debian-armv6" { |
||||
|
inherits = ["debian"] |
||||
|
platforms = ["linux/arm/v6"] |
||||
|
tags = generate_tags("", "-armv6") |
||||
|
} |
||||
|
|
||||
|
// A Group to build all platforms individually for local testing |
||||
|
group "debian-all" { |
||||
|
targets = ["debian-amd64", "debian-arm64", "debian-armv7", "debian-armv6"] |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// ==== Alpine Baking ==== |
||||
|
|
||||
|
// Default Alpine target, will build a container using the hosts platform architecture |
||||
|
target "alpine" { |
||||
|
inherits = ["_default_attributes"] |
||||
|
dockerfile = "docker/Dockerfile.alpine" |
||||
|
tags = generate_tags("-alpine", platform_tag()) |
||||
|
output = [join(",", flatten([["type=docker"], image_index_annotations()]))] |
||||
|
} |
||||
|
|
||||
|
// Multi Platform target, will build one tagged manifest with all supported architectures |
||||
|
// This is mainly used by GitHub Actions to build and push new containers |
||||
|
target "alpine-multi" { |
||||
|
inherits = ["alpine"] |
||||
|
platforms = ["linux/amd64", "linux/arm64", "linux/arm/v7", "linux/arm/v6"] |
||||
|
tags = generate_tags("-alpine", "") |
||||
|
output = [join(",", flatten([["type=registry"], image_index_annotations()]))] |
||||
|
} |
||||
|
|
||||
|
// Per platform targets, to individually test building per platform locally |
||||
|
target "alpine-amd64" { |
||||
|
inherits = ["alpine"] |
||||
|
platforms = ["linux/amd64"] |
||||
|
tags = generate_tags("-alpine", "-amd64") |
||||
|
} |
||||
|
|
||||
|
target "alpine-arm64" { |
||||
|
inherits = ["alpine"] |
||||
|
platforms = ["linux/arm64"] |
||||
|
tags = generate_tags("-alpine", "-arm64") |
||||
|
} |
||||
|
|
||||
|
target "alpine-armv7" { |
||||
|
inherits = ["alpine"] |
||||
|
platforms = ["linux/arm/v7"] |
||||
|
tags = generate_tags("-alpine", "-armv7") |
||||
|
} |
||||
|
|
||||
|
target "alpine-armv6" { |
||||
|
inherits = ["alpine"] |
||||
|
platforms = ["linux/arm/v6"] |
||||
|
tags = generate_tags("-alpine", "-armv6") |
||||
|
} |
||||
|
|
||||
|
// A Group to build all platforms individually for local testing |
||||
|
group "alpine-all" { |
||||
|
targets = ["alpine-amd64", "alpine-arm64", "alpine-armv7", "alpine-armv6"] |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// ==== Bake everything locally ==== |
||||
|
|
||||
|
group "all" { |
||||
|
targets = ["debian-all", "alpine-all"] |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// ==== Baking functions ==== |
||||
|
|
||||
|
// This will return the local platform as amd64, arm64 or armv7 for example |
||||
|
// It can be used for creating a local image tag |
||||
|
function "platform_tag" { |
||||
|
params = [] |
||||
|
result = "-${replace(replace(BAKE_LOCAL_PLATFORM, "linux/", ""), "/", "")}" |
||||
|
} |
||||
|
|
||||
|
|
||||
|
function "get_container_registries" { |
||||
|
params = [] |
||||
|
result = flatten(split(",", CONTAINER_REGISTRIES)) |
||||
|
} |
||||
|
|
||||
|
function "get_base_tags" { |
||||
|
params = [] |
||||
|
result = flatten(split(",", BASE_TAGS)) |
||||
|
} |
||||
|
|
||||
|
function "generate_tags" { |
||||
|
params = [ |
||||
|
suffix, // What to append to the BASE_TAG when needed, like `-alpine` for example |
||||
|
platform // the platform we are building for if needed |
||||
|
] |
||||
|
result = flatten([ |
||||
|
for registry in get_container_registries() : |
||||
|
[for base_tag in get_base_tags() : |
||||
|
concat(["${registry}:${base_tag}${suffix}${platform}"])] |
||||
|
]) |
||||
|
} |
||||
|
|
||||
|
function "image_index_annotations" { |
||||
|
params = [] |
||||
|
result = flatten([ |
||||
|
for key, value in labels() : |
||||
|
value != null ? formatlist("annotation-index.%s=%s", "${key}", "${value}") : [] |
||||
|
]) |
||||
|
} |
@ -0,0 +1,105 @@ |
|||||
|
#!/usr/bin/env bash |
||||
|
|
||||
|
# Determine the basedir of this script. |
||||
|
# It should be located in the same directory as the docker-bake.hcl |
||||
|
# This ensures you can run this script from both inside and outside of the docker directory |
||||
|
BASEDIR=$(RL=$(readlink -n "$0"); SP="${RL:-$0}"; dirname "$(cd "$(dirname "${SP}")" || exit; pwd)/$(basename "${SP}")") |
||||
|
|
||||
|
# Load build env's |
||||
|
source "${BASEDIR}/bake_env.sh" |
||||
|
|
||||
|
# Check if a target is given as first argument |
||||
|
# If not we assume the defaults and pass the given arguments to the podman command |
||||
|
case "${1}" in |
||||
|
alpine*|debian*) |
||||
|
TARGET="${1}" |
||||
|
# Now shift the $@ array so we only have the rest of the arguments |
||||
|
# This allows us too append these as extra arguments too the podman buildx build command |
||||
|
shift |
||||
|
;; |
||||
|
esac |
||||
|
|
||||
|
LABEL_ARGS=( |
||||
|
--label org.opencontainers.image.description="Unofficial Bitwarden compatible server written in Rust" |
||||
|
--label org.opencontainers.image.licenses="AGPL-3.0-only" |
||||
|
--label org.opencontainers.image.documentation="https://github.com/dani-garcia/vaultwarden/wiki" |
||||
|
--label org.opencontainers.image.url="https://github.com/dani-garcia/vaultwarden" |
||||
|
--label org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" |
||||
|
) |
||||
|
if [[ -n "${SOURCE_REPOSITORY_URL}" ]]; then |
||||
|
LABEL_ARGS+=(--label org.opencontainers.image.source="${SOURCE_REPOSITORY_URL}") |
||||
|
fi |
||||
|
if [[ -n "${SOURCE_COMMIT}" ]]; then |
||||
|
LABEL_ARGS+=(--label org.opencontainers.image.revision="${SOURCE_COMMIT}") |
||||
|
fi |
||||
|
if [[ -n "${SOURCE_VERSION}" ]]; then |
||||
|
LABEL_ARGS+=(--label org.opencontainers.image.version="${SOURCE_VERSION}") |
||||
|
fi |
||||
|
|
||||
|
# Check if and which --build-arg arguments we need to configure |
||||
|
BUILD_ARGS=() |
||||
|
if [[ -n "${DB}" ]]; then |
||||
|
BUILD_ARGS+=(--build-arg DB="${DB}") |
||||
|
fi |
||||
|
if [[ -n "${CARGO_PROFILE}" ]]; then |
||||
|
BUILD_ARGS+=(--build-arg CARGO_PROFILE="${CARGO_PROFILE}") |
||||
|
fi |
||||
|
if [[ -n "${VW_VERSION}" ]]; then |
||||
|
BUILD_ARGS+=(--build-arg VW_VERSION="${VW_VERSION}") |
||||
|
fi |
||||
|
|
||||
|
# Set the default BASE_TAGS if non are provided |
||||
|
if [[ -z "${BASE_TAGS}" ]]; then |
||||
|
BASE_TAGS="testing" |
||||
|
fi |
||||
|
|
||||
|
# Set the default CONTAINER_REGISTRIES if non are provided |
||||
|
if [[ -z "${CONTAINER_REGISTRIES}" ]]; then |
||||
|
CONTAINER_REGISTRIES="vaultwarden/server" |
||||
|
fi |
||||
|
|
||||
|
# Check which Dockerfile we need to use, default is debian |
||||
|
case "${TARGET}" in |
||||
|
alpine*) |
||||
|
BASE_TAGS="${BASE_TAGS}-alpine" |
||||
|
DOCKERFILE="Dockerfile.alpine" |
||||
|
;; |
||||
|
*) |
||||
|
DOCKERFILE="Dockerfile.debian" |
||||
|
;; |
||||
|
esac |
||||
|
|
||||
|
# Check which platform we need to build and append the BASE_TAGS with the architecture |
||||
|
case "${TARGET}" in |
||||
|
*-arm64) |
||||
|
BASE_TAGS="${BASE_TAGS}-arm64" |
||||
|
PLATFORM="linux/arm64" |
||||
|
;; |
||||
|
*-armv7) |
||||
|
BASE_TAGS="${BASE_TAGS}-armv7" |
||||
|
PLATFORM="linux/arm/v7" |
||||
|
;; |
||||
|
*-armv6) |
||||
|
BASE_TAGS="${BASE_TAGS}-armv6" |
||||
|
PLATFORM="linux/arm/v6" |
||||
|
;; |
||||
|
*) |
||||
|
BASE_TAGS="${BASE_TAGS}-amd64" |
||||
|
PLATFORM="linux/amd64" |
||||
|
;; |
||||
|
esac |
||||
|
|
||||
|
# Be verbose on what is being executed |
||||
|
set -x |
||||
|
|
||||
|
# Build the image with podman |
||||
|
# We use the docker format here since we are using `SHELL`, which is not supported by OCI |
||||
|
# shellcheck disable=SC2086 |
||||
|
podman buildx build \ |
||||
|
--platform="${PLATFORM}" \ |
||||
|
--tag="${CONTAINER_REGISTRIES}:${BASE_TAGS}" \ |
||||
|
--format=docker \ |
||||
|
"${LABEL_ARGS[@]}" \ |
||||
|
"${BUILD_ARGS[@]}" \ |
||||
|
--file="${BASEDIR}/${DOCKERFILE}" "$@" \ |
||||
|
"${BASEDIR}/.." |
@ -1,17 +1,31 @@ |
|||||
#!/usr/bin/env python3 |
#!/usr/bin/env python3 |
||||
|
|
||||
import os, argparse, json |
import os |
||||
|
import argparse |
||||
|
import json |
||||
|
import yaml |
||||
import jinja2 |
import jinja2 |
||||
|
|
||||
|
# Load settings file |
||||
|
with open("DockerSettings.yaml", 'r') as yaml_file: |
||||
|
yaml_data = yaml.safe_load(yaml_file) |
||||
|
|
||||
|
settings_env = jinja2.Environment( |
||||
|
loader=jinja2.FileSystemLoader(os.getcwd()), |
||||
|
) |
||||
|
settings_yaml = yaml.safe_load(settings_env.get_template("DockerSettings.yaml").render(yaml_data)) |
||||
|
|
||||
args_parser = argparse.ArgumentParser() |
args_parser = argparse.ArgumentParser() |
||||
args_parser.add_argument('template_file', help='Jinja2 template file to render.') |
args_parser.add_argument('template_file', help='Jinja2 template file to render.') |
||||
args_parser.add_argument('render_vars', help='JSON-encoded data to pass to the templating engine.') |
args_parser.add_argument('render_vars', help='JSON-encoded data to pass to the templating engine.') |
||||
cli_args = args_parser.parse_args() |
cli_args = args_parser.parse_args() |
||||
|
|
||||
|
# Merge the default config yaml with the json arguments given. |
||||
render_vars = json.loads(cli_args.render_vars) |
render_vars = json.loads(cli_args.render_vars) |
||||
|
settings_yaml.update(render_vars) |
||||
|
|
||||
environment = jinja2.Environment( |
environment = jinja2.Environment( |
||||
loader=jinja2.FileSystemLoader(os.getcwd()), |
loader=jinja2.FileSystemLoader(os.getcwd()), |
||||
trim_blocks=True, |
trim_blocks=True, |
||||
) |
) |
||||
print(environment.get_template(cli_args.template_file).render(render_vars)) |
print(environment.get_template(cli_args.template_file).render(settings_yaml)) |
||||
|
@ -1,20 +0,0 @@ |
|||||
The hooks in this directory are used to create multi-arch images using Docker Hub automated builds. |
|
||||
|
|
||||
Docker Hub hooks provide these predefined [environment variables](https://docs.docker.com/docker-hub/builds/advanced/#environment-variables-for-building-and-testing): |
|
||||
|
|
||||
* `SOURCE_BRANCH`: the name of the branch or the tag that is currently being tested. |
|
||||
* `SOURCE_COMMIT`: the SHA1 hash of the commit being tested. |
|
||||
* `COMMIT_MSG`: the message from the commit being tested and built. |
|
||||
* `DOCKER_REPO`: the name of the Docker repository being built. |
|
||||
* `DOCKERFILE_PATH`: the dockerfile currently being built. |
|
||||
* `DOCKER_TAG`: the Docker repository tag being built. |
|
||||
* `IMAGE_NAME`: the name and tag of the Docker repository being built. (This variable is a combination of `DOCKER_REPO:DOCKER_TAG`.) |
|
||||
|
|
||||
The current multi-arch image build relies on the original vaultwarden Dockerfiles, which use cross-compilation for architectures other than `amd64`, and don't yet support all arch/distro combinations. However, cross-compilation is much faster than QEMU-based builds (e.g., using `docker buildx`). This situation may need to be revisited at some point. |
|
||||
|
|
||||
## References |
|
||||
|
|
||||
* https://docs.docker.com/docker-hub/builds/advanced/ |
|
||||
* https://docs.docker.com/engine/reference/commandline/manifest/ |
|
||||
* https://www.docker.com/blog/multi-arch-build-and-images-the-simple-way/ |
|
||||
* https://success.docker.com/article/how-do-i-authenticate-with-the-v2-api |
|
@ -1,15 +0,0 @@ |
|||||
#!/usr/bin/env bash |
|
||||
|
|
||||
# The default Debian-based images support these arches for all database backends. |
|
||||
arches=( |
|
||||
amd64 |
|
||||
armv6 |
|
||||
armv7 |
|
||||
arm64 |
|
||||
) |
|
||||
export arches |
|
||||
|
|
||||
if [[ "${DOCKER_TAG}" == *alpine ]]; then |
|
||||
distro_suffix=.alpine |
|
||||
fi |
|
||||
export distro_suffix |
|
@ -1,51 +0,0 @@ |
|||||
#!/usr/bin/env bash |
|
||||
|
|
||||
echo ">>> Building images..." |
|
||||
|
|
||||
# shellcheck source=arches.sh |
|
||||
source ./hooks/arches.sh |
|
||||
|
|
||||
if [[ -z "${SOURCE_COMMIT}" ]]; then |
|
||||
# This var is typically predefined by Docker Hub, but it won't be |
|
||||
# when testing locally. |
|
||||
SOURCE_COMMIT="$(git rev-parse HEAD)" |
|
||||
fi |
|
||||
|
|
||||
# Construct a version string in the style of `build.rs`. |
|
||||
GIT_EXACT_TAG="$(git describe --tags --abbrev=0 --exact-match 2>/dev/null)" |
|
||||
if [[ -n "${GIT_EXACT_TAG}" ]]; then |
|
||||
SOURCE_VERSION="${GIT_EXACT_TAG}" |
|
||||
else |
|
||||
GIT_LAST_TAG="$(git describe --tags --abbrev=0)" |
|
||||
SOURCE_VERSION="${GIT_LAST_TAG}-${SOURCE_COMMIT:0:8}" |
|
||||
fi |
|
||||
|
|
||||
LABELS=( |
|
||||
# https://github.com/opencontainers/image-spec/blob/master/annotations.md |
|
||||
org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" |
|
||||
org.opencontainers.image.documentation="https://github.com/dani-garcia/vaultwarden/wiki" |
|
||||
org.opencontainers.image.licenses="AGPL-3.0-only" |
|
||||
org.opencontainers.image.revision="${SOURCE_COMMIT}" |
|
||||
org.opencontainers.image.source="${SOURCE_REPOSITORY_URL}" |
|
||||
org.opencontainers.image.url="https://github.com/dani-garcia/vaultwarden" |
|
||||
org.opencontainers.image.version="${SOURCE_VERSION}" |
|
||||
) |
|
||||
LABEL_ARGS=() |
|
||||
for label in "${LABELS[@]}"; do |
|
||||
LABEL_ARGS+=(--label "${label}") |
|
||||
done |
|
||||
|
|
||||
# Check if DOCKER_BUILDKIT is set, if so, use the Dockerfile.buildkit as template |
|
||||
if [[ -n "${DOCKER_BUILDKIT}" ]]; then |
|
||||
buildkit_suffix=.buildkit |
|
||||
fi |
|
||||
|
|
||||
set -ex |
|
||||
|
|
||||
for arch in "${arches[@]}"; do |
|
||||
docker build \ |
|
||||
"${LABEL_ARGS[@]}" \ |
|
||||
-t "${DOCKER_REPO}:${DOCKER_TAG}-${arch}" \ |
|
||||
-f "docker/${arch}/Dockerfile${buildkit_suffix}${distro_suffix}" \ |
|
||||
. |
|
||||
done |
|
@ -1,28 +0,0 @@ |
|||||
#!/usr/bin/env bash |
|
||||
|
|
||||
set -ex |
|
||||
|
|
||||
# If requested, print some environment info for troubleshooting. |
|
||||
if [[ -n "${DOCKER_HUB_DEBUG}" ]]; then |
|
||||
id |
|
||||
pwd |
|
||||
df -h |
|
||||
env |
|
||||
docker info |
|
||||
docker version |
|
||||
fi |
|
||||
|
|
||||
# Install build dependencies. |
|
||||
deps=( |
|
||||
jq |
|
||||
) |
|
||||
apt-get update |
|
||||
apt-get install -y "${deps[@]}" |
|
||||
|
|
||||
# Docker Hub uses a shallow clone and doesn't fetch tags, which breaks some |
|
||||
# Git operations that we perform later, so fetch the complete history and |
|
||||
# tags first. Note that if the build is cached, the clone may have been |
|
||||
# unshallowed already; if so, unshallowing will fail, so skip it. |
|
||||
if [[ -f .git/shallow ]]; then |
|
||||
git fetch --unshallow --tags |
|
||||
fi |
|
@ -1,111 +0,0 @@ |
|||||
#!/usr/bin/env bash |
|
||||
|
|
||||
# shellcheck source=arches.sh |
|
||||
source ./hooks/arches.sh |
|
||||
|
|
||||
export DOCKER_CLI_EXPERIMENTAL=enabled |
|
||||
|
|
||||
# Join a list of args with a single char. |
|
||||
# Ref: https://stackoverflow.com/a/17841619 |
|
||||
join() { local IFS="$1"; shift; echo "$*"; } |
|
||||
|
|
||||
set -ex |
|
||||
|
|
||||
echo ">>> Starting local Docker registry when needed..." |
|
||||
|
|
||||
# Docker Buildx's `docker-container` driver is needed for multi-platform |
|
||||
# builds, but it can't access existing images on the Docker host (like the |
|
||||
# cross-compiled ones we just built). Those images first need to be pushed to |
|
||||
# a registry -- Docker Hub could be used, but since it's not trivial to clean |
|
||||
# up those intermediate images on Docker Hub, it's easier to just run a local |
|
||||
# Docker registry, which gets cleaned up automatically once the build job ends. |
|
||||
# |
|
||||
# https://docs.docker.com/registry/deploying/ |
|
||||
# https://hub.docker.com/_/registry |
|
||||
# |
|
||||
# Use host networking so the buildx container can access the registry via |
|
||||
# localhost. |
|
||||
# |
|
||||
# First check if there already is a registry container running, else skip it. |
|
||||
# This will only happen either locally or running it via Github Actions |
|
||||
# |
|
||||
if ! timeout 5 bash -c 'cat < /dev/null > /dev/tcp/localhost/5000'; then |
|
||||
# defaults to port 5000 |
|
||||
docker run -d --name registry --network host registry:2 |
|
||||
fi |
|
||||
|
|
||||
# Docker Hub sets a `DOCKER_REPO` env var with the format `index.docker.io/user/repo`. |
|
||||
# Strip the registry portion to construct a local repo path for use in `Dockerfile.buildx`. |
|
||||
LOCAL_REGISTRY="localhost:5000" |
|
||||
REPO="${DOCKER_REPO#*/}" |
|
||||
LOCAL_REPO="${LOCAL_REGISTRY}/${REPO}" |
|
||||
|
|
||||
echo ">>> Pushing images to local registry..." |
|
||||
|
|
||||
for arch in "${arches[@]}"; do |
|
||||
docker_image="${DOCKER_REPO}:${DOCKER_TAG}-${arch}" |
|
||||
local_image="${LOCAL_REPO}:${DOCKER_TAG}-${arch}" |
|
||||
docker tag "${docker_image}" "${local_image}" |
|
||||
docker push "${local_image}" |
|
||||
done |
|
||||
|
|
||||
echo ">>> Setting up Docker Buildx..." |
|
||||
|
|
||||
# Same as earlier, use host networking so the buildx container can access the |
|
||||
# registry via localhost. |
|
||||
# |
|
||||
# Ref: https://github.com/docker/buildx/issues/94#issuecomment-534367714 |
|
||||
# |
|
||||
# Check if there already is a builder running, else skip this and use the existing. |
|
||||
# This will only happen either locally or running it via Github Actions |
|
||||
# |
|
||||
if ! docker buildx inspect builder > /dev/null 2>&1 ; then |
|
||||
docker buildx create --name builder --use --driver-opt network=host |
|
||||
fi |
|
||||
|
|
||||
echo ">>> Running Docker Buildx..." |
|
||||
|
|
||||
tags=("${DOCKER_REPO}:${DOCKER_TAG}") |
|
||||
|
|
||||
# If the Docker tag starts with a version number, assume the latest release |
|
||||
# is being pushed. Add an extra tag (`latest` or `alpine`, as appropriate) |
|
||||
# to make it easier for users to track the latest release. |
|
||||
if [[ "${DOCKER_TAG}" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then |
|
||||
if [[ "${DOCKER_TAG}" == *alpine ]]; then |
|
||||
tags+=("${DOCKER_REPO}:alpine") |
|
||||
else |
|
||||
tags+=("${DOCKER_REPO}:latest") |
|
||||
fi |
|
||||
fi |
|
||||
|
|
||||
tag_args=() |
|
||||
for tag in "${tags[@]}"; do |
|
||||
tag_args+=(--tag "${tag}") |
|
||||
done |
|
||||
|
|
||||
# Docker Buildx takes a list of target platforms (OS/arch/variant), so map |
|
||||
# the arch list to a platform list (assuming the OS is always `linux`). |
|
||||
declare -A arch_to_platform=( |
|
||||
[amd64]="linux/amd64" |
|
||||
[armv6]="linux/arm/v6" |
|
||||
[armv7]="linux/arm/v7" |
|
||||
[arm64]="linux/arm64" |
|
||||
) |
|
||||
platforms=() |
|
||||
for arch in "${arches[@]}"; do |
|
||||
platforms+=("${arch_to_platform[$arch]}") |
|
||||
done |
|
||||
platform="$(join "," "${platforms[@]}")" |
|
||||
|
|
||||
# Run the build, pushing the resulting images and multi-arch manifest list to |
|
||||
# Docker Hub. The Dockerfile is read from stdin to avoid sending any build |
|
||||
# context, which isn't needed here since the actual cross-compiled images |
|
||||
# have already been built. |
|
||||
docker buildx build \ |
|
||||
--network host \ |
|
||||
--build-arg LOCAL_REPO="${LOCAL_REPO}" \ |
|
||||
--build-arg DOCKER_TAG="${DOCKER_TAG}" \ |
|
||||
--platform "${platform}" \ |
|
||||
"${tag_args[@]}" \ |
|
||||
--push \ |
|
||||
- < ./docker/Dockerfile.buildx |
|
@ -1,4 +1,4 @@ |
|||||
[toolchain] |
[toolchain] |
||||
channel = "1.72.0" |
channel = "1.73.0" |
||||
components = [ "rustfmt", "clippy" ] |
components = [ "rustfmt", "clippy" ] |
||||
profile = "minimal" |
profile = "minimal" |
||||
|
Loading…
Reference in new issue