conduit new dockerfile
The snippet can be accessed without any authentication.
Authored by
Jonas Zohren
Dockerfile 3.12 KiB
# syntax=docker/dockerfile:1.2
# -------------------------------------------------------------------------- #
# Stage 1 - Build project in fat builder stage #
# -------------------------------------------------------------------------- #
FROM rust:1.50 as builder
RUN mkdir /builddir
WORKDIR /builddir
# Download dependencies sources and cache them
COPY ./Cargo.lock ./Cargo.lock
COPY ./Cargo.toml ./Cargo.toml
RUN cargo fetch
# Copy the actual project source code and compile it
COPY ./src src
RUN cargo build --release
# -------------------------------------------------------------------------- #
# Stage 2 - Create slim container with only the final binary to run conduit #
# -------------------------------------------------------------------------- #
FROM alpine:latest as runner
FROM alpine:3.12
ARG CREATED
ARG VERSION
ARG GIT_REF=origin/master
ENV CONDUIT_CONFIG="/srv/conduit/conduit.toml"
# Add www-data user and group with UID 82, as used by alpine
# https://git.alpinelinux.org/aports/tree/main/nginx/nginx.pre-install
RUN set -x ; \
addgroup -Sg 82 www-data 2>/dev/null ; \
adduser -S -D -H -h /srv/conduit -G www-data -g www-data www-data 2>/dev/null ; \
addgroup www-data www-data 2>/dev/null && exit 0 ; exit 1
# Create a volume for the database, to persist its contents
VOLUME ["/srv/conduit/.local/share/conduit"]
# Install packages needed to run Conduit
RUN apk add --no-cache \
ca-certificates \
curl \
libgcc
# Test if Conduit is still alive, uses the same endpoint as Element
HEALTHCHECK --start-period=2s CMD curl --fail -s http://localhost:8000/_matrix/client/versions || curl -k --fail -s https://localhost:8000/_matrix/client/versions || exit 1
# Prepare directory and copy binary from builder stage into it
RUN mkdir -p /srv/conduit/.local/share/conduit
COPY --from=builder /builddir/target/release/conduit /srv/conduit/
RUN chown -cR www-data:www-data /srv/conduit
# Labels according to https://github.com/opencontainers/image-spec/blob/master/annotations.md
# including a custom label specifying the build command
LABEL org.opencontainers.image.created=${CREATED} \
org.opencontainers.image.authors="Conduit Contributors" \
org.opencontainers.image.title="Conduit" \
org.opencontainers.image.version=${VERSION} \
org.opencontainers.image.vendor="Conduit Contributors" \
org.opencontainers.image.description="A Matrix homeserver written in Rust" \
org.opencontainers.image.url="https://conduit.rs/" \
org.opencontainers.image.revision=${GIT_REF} \
org.opencontainers.image.source="https://gitlab.com/famedly/conduit.git" \
org.opencontainers.image.licenses="Apache-2.0" \
org.opencontainers.image.documentation="" \
org.opencontainers.image.ref.name="" \
org.label-schema.docker.build="docker build . -t matrixconduit/matrix-conduit:latest --build-arg CREATED=$(date -u +'%Y-%m-%dT%H:%M:%SZ') --build-arg VERSION=$(grep -m1 -o '[0-9].[0-9].[0-9]' Cargo.toml)" \
maintainer="Weasy666"
# Prepare execution environment
USER www-data
WORKDIR /srv/conduit
EXPOSE 8000
ENTRYPOINT [ "/srv/conduit/conduit" ]
Please register or sign in to comment