Fixes for docker and cabal-install 2.4.
[packages/binary.git] / docker / Dockerfile.anyghc
1 # Dockerfile to load a haskell environment for running binary's test suite.
2 #
3 # Building the Dockerfile creates an image which has the haskell environment
4 # with ghc and cabal setup and ready to use.
5 #
6 # Use a docker volume to cache built dependencies. It will greatly speed up
7 # running the tests repeatedly.
8 #
9 # Create a volume:
10 #
11 #   docker volume create cabal-store-cache
12 #
13 # How to build:
14 #
15 #   docker build \
16 #     -f docker/Dockerfile.ghc843 \
17 #     -t haskell/binary \
18 #     --build-arg ghcver=8.4.2 \
19 #     .
20 #
21 # How to run (caching the cabal store directory), default is 'cabal new-test':
22 #
23 #   docker run -it haskell/binary -v cabal-store-cache:/root/.cabal/store
24 #
25 # Run 'cabal new-bench' or any other command (bash, to get into the machine):
26 #
27 #   docker run -it haskell/binary -v cabal-store-cache:/root/.cabal/store \
28 #     cabal new-bench
29 #
30 # Hacks to build binary:
31 #
32 #   1) Copy all files from the host machine.
33 #
34 #   2) Rename binary to binary-next. This is an unfortunate consequence of
35 #      binary being used by its test and benchmark dependencies.
36 #      Not renaming binary will make cabal confused and it'll fail to build.
37 #
38 #      Cabal can be made to build properly by carefully installing the test
39 #      and benchmark dependencies manually, like it's done in .travis.yml.
40 #      Unfortunately that setup is very fragile since changing the
41 #      dependencies in binary.cabal also requires updating .travis.yml.
42 #      Thus .travis.yml gets out of sync when we forget.
43 #      This method also doesn't work with the nix-style commands which
44 #      themselves take care of installing dependencies.
45 #      The simples workaround I've found, and the only thing that works
46 #      with nix-style commands, is to simply rename the package
47 #
48 #   3) Do 'cabal sdist' to get only the files for source distribution.
49 #
50 #   4) Unpack the .tar.gz file from (3) and copy generics-bench.cache.gz
51 #      to the same dir.
52 #
53 #   5) The setup is complete. You may run cabal new-test,
54 #      or any other command.
55 #
56
57 FROM debian:stable
58
59 # setup locale.
60 # not setting a locale will make some apps fail when outputting utf8.
61 RUN apt-get update && \
62     apt-get install -y locales && \
63     locale-gen C.UTF-8 && \
64     /usr/sbin/update-locale LANG=C.UTF-8 && \
65     apt-get remove -y locales
66
67 ENV LANG C.UTF-8
68
69 # key used by haskell repo
70 RUN apt-get update && apt-get install -y gnupg dirmngr
71 RUN apt-key adv --keyserver keyserver.ubuntu.com  --recv-keys BA3CBA3FFE22B574
72
73 # add haskell repo for debian
74 RUN echo "deb http://downloads.haskell.org/debian stretch main" > /etc/apt/sources.list.d/haskell.list
75
76 ARG ghcver=8.4.3
77 ARG cabalinstallver=2.4
78
79 RUN apt update && apt install -y cabal-install-$cabalinstallver
80 RUN apt update && apt install -y ghc-$ghcver
81 RUN apt update && apt-get install -y zlib1g-dev
82
83 ENV PATH=/opt/ghc/bin:$PATH
84
85 RUN cabal new-update
86
87 COPY . /workdir/copy
88
89 WORKDIR /workdir/copy
90 RUN sed -i.bak -e 's/name:\s*binary/name: binary-next/' binary.cabal
91 RUN mv binary.cabal binary-next.cabal
92 RUN cabal new-sdist
93
94 WORKDIR /workdir/builddir
95 RUN tar xf /workdir/copy/dist-newstyle/sdist/*.tar.gz -C /workdir/builddir
96 RUN mv /workdir/builddir/binary-* /workdir/builddir/binary-next
97 # generics-bench.cache.gz is not part of the binary distribution,
98 # it's too large. It only lives in the git repo. Copy it manually.
99 RUN mv /workdir/copy/generics-bench.cache.gz /workdir/builddir/binary-next
100 WORKDIR /workdir/builddir/binary-next
101
102 CMD cabal new-test