FROM debian:bookworm-slim as base ENV LANG C.UTF-8 ARG GHC_VERSION=9.6.3 ARG STACK_VERSION=recommended ARG STACK_RESOLVER=lts-22.6 ARG CABAL_VERSION=recommended ARG HLS_VERSION=recommended ARG LLVM_VERSION=17 ENV USERNAME=vscode \ USER_UID=1000 \ USER_GID=1000 \ DEBIAN_FRONTEND=noninteractive \ GHC_VERSION=${GHC_VERSION} \ STACK_VERSION=${STACK_VERSION} \ STACK_RESOLVER=${STACK_RESOLVER} \ CABAL_VERSION=${CABAL_VERSION} \ HLS_VERSION=${HLS_VERSION} \ LLVM_VERSION=${LLVM_VERSION} RUN ulimit -n 8192 RUN VERSION_CODENAME=$(grep VERSION_CODENAME /etc/os-release | cut -d'=' -f2) && \ apt-get update && \ apt-get install -y --no-install-recommends software-properties-common wget && \ # I don't know why, nor do I have any mental capacity to figure it out, # but we need to add the repository twice, otherwise it doesn't work (repo isn't being added) add-apt-repository -y -s -n "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${LLVM_VERSION} main" && \ add-apt-repository -y -s -n "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${LLVM_VERSION} main" && \ wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc && \ apt-get update && \ apt-get install -y --no-install-recommends apt-utils bash build-essential ca-certificates curl gcc git gnupg libffi-dev libffi8 libgmp-dev libgmp-dev libgmp10 libicu-dev libncurses-dev libncurses5 libnuma1 libnuma-dev libtinfo5 lsb-release make procps sudo xz-utils z3 zlib1g-dev clang-$LLVM_VERSION lldb-$LLVM_VERSION lld-$LLVM_VERSION clangd-$LLVM_VERSION RUN groupadd --gid ${USER_GID} ${USERNAME} && \ useradd -ms /bin/bash -K MAIL_DIR=/dev/null --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \ echo ${USERNAME} ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/${USERNAME} && \ chmod 0440 /etc/sudoers.d/${USERNAME} USER ${USER_UID}:${USER_GID} WORKDIR /home/${USERNAME} ENV PATH="/home/${USERNAME}/.local/bin:/home/${USERNAME}/.cabal/bin:/home/${USERNAME}/.ghcup/bin:$PATH" RUN echo "export PATH=${PATH}" >> /home/${USERNAME}/.profile ENV BOOTSTRAP_HASKELL_NONINTERACTIVE=yes \ BOOTSTRAP_HASKELL_NO_UPGRADE=yes FROM base as tooling RUN curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh # Set the GHC version. RUN ghcup install ghc ${GHC_VERSION} --set # Install cabal-iinstall RUN ghcup install cabal ${CABAL_VERSION} --set # Update Cabal. RUN cabal update && cabal new-install cabal-install # Configure cabal RUN cabal user-config update -f && \ sed -i 's/-- ghc-options:/ghc-options: -haddock/g' ~/.cabal/config # Install stack RUN ghcup install stack ${STACK_VERSION} --set # Set system-ghc, install-ghc and resolver for stack. RUN ((stack ghc -- --version 2>/dev/null) || true) && \ # Set global defaults for stack. stack config --system-ghc set system-ghc true --global && \ stack config --system-ghc set install-ghc false --global && \ stack config --system-ghc set resolver ${STACK_RESOLVER} # Set global custom defaults for stack. RUN printf "ghc-options:\n \"\$everything\": -haddock\n" >> /home/${USERNAME}/.stack/config.yaml # Install hls RUN ghcup install hls ${HLS_VERSION} --set FROM tooling as packages # Install global packages. # Versions are pinned, since we don't want to accidentally break anything (by always installing latest). RUN cabal install --haddock-hoogle --minimize-conflict-set \ fsnotify \ haskell-dap \ ghci-dap \ haskell-debug-adapter \ hlint \ apply-refact \ retrie \ hoogle \ ormolu FROM packages as hoogle # Generate hoogle db RUN hoogle generate --download --haskell ENV DEBIAN_FRONTEND=dialog ENTRYPOINT ["/bin/bash"]