Skip to content
Snippets Groups Projects

conduit new dockerfile

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    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" ]
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment