From 75615daedc9a1eecb5efc753eaba3df376a7b956 Mon Sep 17 00:00:00 2001 From: Andy Li <1450947+andy1li@users.noreply.github.com> Date: Wed, 9 Apr 2025 09:15:23 +0800 Subject: [PATCH] chore: update Haskell Dockerfile for improved caching and dependency management - Added environment variable to ensure container rebuilds when dependency files change. - Adjusted COPY commands to prevent cache misses by excluding .git and README.md. - Removed unnecessary dummy content and streamlined the build process. --- dockerfiles/haskell-9.8.Dockerfile | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/dockerfiles/haskell-9.8.Dockerfile b/dockerfiles/haskell-9.8.Dockerfile index 9d56ab7..4e853ab 100644 --- a/dockerfiles/haskell-9.8.Dockerfile +++ b/dockerfiles/haskell-9.8.Dockerfile @@ -1,6 +1,7 @@ FROM haskell:9.8.4-bullseye -WORKDIR /app +# Ensures the container is re-built if go.mod or go.sum changes +ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="stack.yaml,package.yaml,stack.yaml.lock" RUN mkdir -p /etc/stack @@ -11,24 +12,17 @@ RUN echo "allow-different-user: true" >> /etc/stack/config.yaml RUN echo "install-ghc: false" >> /etc/stack/config.yaml RUN echo "system-ghc: true" >> /etc/stack/config.yaml -COPY stack.yaml package.yaml stack.yaml.lock /app/ +WORKDIR /app -# Dummy static content to circumvent the /app doesn't exist warning -RUN mkdir /app/app -RUN echo 'main :: IO ()' >> /app/app/Main.hs -RUN echo 'main = putStrLn "Hello, World!"' >> /app/app/Main.hs +# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses +COPY . /app/ +RUN rm -rf /app/.git /app/README.md ENV STACK_ROOT=/app/.stack - RUN stack build RUN stack clean codecrafters-http-server + RUN mkdir /app-cached RUN mv .stack-work /app-cached/.stack-work RUN mv .stack /app-cached/.stack - RUN rm -rf /app/app - -RUN echo "cd \${CODECRAFTERS_REPOSITORY_DIR} && stack build" > /codecrafters-precompile.sh -RUN chmod +x /codecrafters-precompile.sh - -ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="stack.yaml,package.yaml,stack.yaml.lock"