diff --git a/Dockerfile b/Dockerfile index c9356908c..d0768abcb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,26 @@ FROM haskell:8.6 as build WORKDIR /build RUN cabal new-update + +# Build our upstream dependencies after copying in only enough to tell cabal +# what they are. This will make these layers cache better even as we change the +# code of semantic itself. +COPY semantic.cabal /build/ +COPY cabal.project /build/ +COPY semantic-core/semantic-core.cabal /build/semantic-core/ +COPY vendor /build/vendor +RUN cabal new-build --only-dependencies + +# Once the dependencies are built, copy in the rest of the code and compile +# semantic itself. COPY . /build RUN cabal new-build semantic:exe:semantic # A fake `install` target until we can get `cabal new-install` to work -RUN cp $(find dist-newstyle -name semantic -type f -perm -u=x) /semantic +RUN cp $(find dist-newstyle -name semantic -type f -perm -u=x) /usr/local/bin/semantic +# Create a fresh image containing only the compiled CLI program, so that the +# image isn't bulked up by all of the extra build state. FROM debian:stretch RUN apt-get update && \ apt-get install -y \ @@ -15,5 +29,5 @@ RUN apt-get update && \ apt-get autoremove -y && \ apt-get clean -y && \ rm -rf /var/lib/apt/lists/* -COPY --from=build /semantic /usr/local/bin/semantic +COPY --from=build /usr/local/bin/semantic /usr/local/bin/semantic ENTRYPOINT ["/usr/local/bin/semantic"]