From 2abee7edf8cd1c975c9336aa7885f6f818b88d7e Mon Sep 17 00:00:00 2001 From: shum Date: Thu, 21 Mar 2024 23:37:53 +0000 Subject: [PATCH] docker: statically build CLI --- Dockerfile | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6c60195f97..bd2e2ae700 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,20 @@ -ARG TAG=22.04 - -FROM ubuntu:${TAG} AS build - -### Build stage - -# Install curl and git and simplex-chat dependencies -RUN apt-get update && apt-get install -y curl git build-essential libgmp3-dev zlib1g-dev llvm-12 llvm-12-dev libnuma-dev libssl-dev +FROM alpine:latest AS build-stage + +# Alpine Linux doesn't provide libtinfow.so.6 library, so we need to symlink it. +# Add essential packages for ghc/cabal to work. +RUN apk add --no-cache \ + curl \ + git \ + xz \ + grep \ + ghc-dev \ + gmp-dev \ + zlib-static \ + zlib-dev \ + openssl-libs-static \ + openssl-dev \ + alpine-sdk &&\ + ln -s /usr/lib/libncursesw.so.6 /usr/lib/libtinfow.so.6 # Specify bootstrap Haskell versions ENV BOOTSTRAP_HASKELL_GHC_VERSION=9.6.3 @@ -21,21 +30,30 @@ ENV PATH="/root/.cabal/bin:/root/.ghcup/bin:$PATH" RUN ghcup set ghc "${BOOTSTRAP_HASKELL_GHC_VERSION}" && \ ghcup set cabal "${BOOTSTRAP_HASKELL_CABAL_VERSION}" +# Install hpack +RUN cabal install --install-method=copy --installdir=/usr/local/bin hpack-0.36.0 + +# Copy project in PWD to dontainer COPY . /project WORKDIR /project # Adjust build RUN cp ./scripts/cabal.project.local.linux ./cabal.project.local +# Add optimization flags and build statically +RUN sed -i '/- -Wunused-type-patterns/a\ - -O2\n\ - -split-sections\n\ - -with-rtsopts=-N\n\ - -static\n\cc-options: -static\n\ld-options: -static -pthread' package.yaml + +# Reconfigure cabal project +RUN hpack + # Compile simplex-chat RUN cabal update -RUN cabal build exe:simplex-chat +RUN cabal build -j exe:simplex-chat # Strip the binary from debug symbols to reduce size RUN bin=$(find /project/dist-newstyle -name "simplex-chat" -type f -executable) && \ mv "$bin" ./ && \ strip ./simplex-chat -# Copy compiled app from build stage FROM scratch AS export-stage -COPY --from=build /project/simplex-chat / +COPY --from=build-stage /project/simplex-chat /