From e9ccb3582577596b93e5df3c7486e2bf5d9a4bbc Mon Sep 17 00:00:00 2001 From: Adam Weeden Date: Wed, 10 Mar 2021 18:54:33 -0500 Subject: [PATCH] Docker: slim down image size, by removing temp/cache files (PR #1128) Per the [note](https://github.com/nativefier/nativefier/pull/1122#discussion_r588922780) by @SuperSandro2000 in #1122 Docker will still cache files in intermediate layers if you delete them, so they'll still be part of the image. Only solution seems to be to delete them as you create them so they don't cache: Per https://stackoverflow.com/questions/53998310/docker-remove-file-from-intermediate-layer Co-authored-by: Sandro --- .dockerignore | 12 ++++++++---- Dockerfile | 46 +++++++++++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/.dockerignore b/.dockerignore index c9b4302..c9de68d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,6 @@ +# git +.git* + # OSX .DS_Store @@ -7,11 +10,12 @@ lib/* app/lib/* built-tests - -# commit a placeholder to keep the app/lib directory -!app/lib/.placeholder - dist +app/dist + +# Docs +docs +*.md # Logs logs diff --git a/Dockerfile b/Dockerfile index a7b4961..a4c45ab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,44 +2,52 @@ FROM node:12-alpine LABEL description="Alpine image to build Nativefier apps" -# Install dependencies +# Install dependencies and cleanup extraneous files RUN apk update \ && apk add bash wine imagemagick dos2unix \ && rm -rf /var/cache/apk/* + +# Use node (1000) as default user not root +USER node + +ENV NPM_PACKAGES="/home/node/npm-packages" +ENV PATH="$PATH:$NPM_PACKAGES/bin" +ENV MANPATH="$MANPATH:$NPM_PACKAGES/share/man" + +# Setup a global packages location for "node" user so we can npm link +RUN mkdir $NPM_PACKAGES \ + && npm config set prefix $NPM_PACKAGES + WORKDIR /nativefier -# Add sources -COPY . . +# Add sources with node as the owner so that it has the power it needs to build in /nativefier +COPY --chown=node:node . . # Fix line endings that may have gotten mangled in Windows RUN find ./icon-scripts ./src ./app -type f -print0 | xargs -0 dos2unix -# Build nativefier and link globally -WORKDIR /nativefier/app -RUN npm install -WORKDIR /nativefier - -# Install (note that we had to manually install in `app` before, as `prepare` won't run as root) -# Also, running tests, to ensure we don't Docker build & publish broken stuff -RUN npm install && npm run build && npm test && npm link - -# Cleanup test artifacts -RUN rm -rf /tmp/nativefier* - -# Use 1000 as default user not root -USER 1000 +# Link (which will install and build) +# Run tests (to ensure we don't Docker build & publish broken stuff) +# Cleanup leftover files in this step to not waste Docker layer space +# Make sure nativefier is executable +RUN npm link \ + && npm test \ + && rm -rf /tmp/nativefier* ~/.npm/_cacache ~/.cache/electron \ + && chmod +x $NPM_PACKAGES/bin/nativefier # Run a {lin,mac,win} build # 1. to check installation was sucessful # 2. to cache electron distributables and avoid downloads at runtime +# Also delete generated apps so they don't get added to the Docker layer +# !Important! The `rm -rf` command must be in the same `RUN` command (using an `&&`), to not waste Docker layer space RUN nativefier https://github.com/nativefier/nativefier /tmp/nativefier \ && nativefier -p osx https://github.com/nativefier/nativefier /tmp/nativefier \ - && nativefier -p windows https://github.com/nativefier/nativefier /tmp/nativefier + && nativefier -p windows https://github.com/nativefier/nativefier /tmp/nativefier \ + && rm -rf /tmp/nativefier RUN echo Generated Electron cache size: $(du -sh ~/.cache/electron) \ - && rm -rf /tmp/nativefier \ && echo Final image size: $(du -sh / 2>/dev/null) ENTRYPOINT ["nativefier"]