diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 61217ad40..000000000 --- a/Dockerfile +++ /dev/null @@ -1,59 +0,0 @@ -FROM node:16.13-bullseye-slim as node - -FROM node as build -# Having multiple steps in builder doesn't increase the final image size -# So having verbose steps for readability and caching should be the target - -WORKDIR /opt/viewer -COPY packages/viewer/package*.json ./ -RUN npm install -COPY packages/viewer . -RUN npm run build - -WORKDIR /opt/frontend -# Copy package defs first they are the least likely to change -# Keeping this order will least likely trigger full rebuild -COPY packages/frontend/package*.json ./ -RUN npm install ../viewer -RUN npm ci - -WORKDIR /opt -COPY packages/server/package*.json server/ -ENV NODE_ENV production -RUN npm --prefix server ci server - -# Copy remaining files across for frontend. Changes to these files -# will be more common than changes to the dependencies. This should -# speed up rebuilds. -COPY packages/frontend frontend - -WORKDIR /opt/frontend -RUN npm run build - -FROM node as runtime - -RUN apk add --no-cache tini=0.19.0-r0 -ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /wait -RUN chmod +x /wait - -# Use a non-root user for increased security. -USER node - -ENV NODE_ENV production - -# Copy dependencies and static files from build layer -COPY --from=build --chown=node /opt/frontend/dist /home/node/frontend/dist -COPY --from=build --chown=node /opt/server /home/node/server - -# Run the application from the non root users home directory -WORKDIR /home/node/server - -# Copy remaining files across for the server. Changes to these -# files will be more common than changes to the dependencies. -# This should speed up rebuilds. -COPY --chown=node packages/server /home/node/server - -# Init for containers https://github.com/krallin/tini -ENTRYPOINT [ "/sbin/tini", "--" ] - -CMD /wait && node bin/www diff --git a/packages/frontend/Dockerfile b/packages/frontend/Dockerfile index 000480c88..ef9a9556f 100644 --- a/packages/frontend/Dockerfile +++ b/packages/frontend/Dockerfile @@ -1,23 +1,34 @@ # NOTE: Docker context should be set to git root directory, to include the viewer # build stage -FROM node:16.13-bullseye-slim as build-stage +FROM node:16.13-bullseye-slim as deps-build WORKDIR /opt/objectloader COPY packages/objectloader /opt/objectloader RUN npm install RUN npm run build +# this whole thing is required cause npm 6.* doesn't allow for pack output dir specification +RUN mkdir /packages +# invoke npm pack and move its result to the packages folder when done +RUN npm pack --pack-destination=/packages/ WORKDIR /opt/viewer COPY packages/viewer/package*.json ./ +# this installs objectloader from a tarball +RUN npm i $(find /packages -type f -name "speckle*.tgz") RUN npm install -RUN npm install ../objectloader COPY packages/viewer . RUN npm run build +RUN npm pack --pack-destination=/packages/ +RUN ls /packages + +FROM node:16.13-bullseye-slim as build-stage WORKDIR /opt/frontend +COPY --from=deps-build /packages /packages COPY packages/frontend/package*.json ./ -RUN npm install ../viewer +# RUN npm install ../viewer +RUN npm i $(find /packages -type f -name "speckle*.tgz") RUN npm ci COPY packages/frontend . RUN npm run build diff --git a/packages/preview-service/Dockerfile b/packages/preview-service/Dockerfile index d377e8ee9..ba76c3976 100644 --- a/packages/preview-service/Dockerfile +++ b/packages/preview-service/Dockerfile @@ -2,7 +2,7 @@ # build stage -FROM node:14.16-buster-slim as build-stage +FROM node:14.16-buster-slim as deps-build ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} @@ -12,25 +12,32 @@ COPY packages/objectloader/package*.json ./ RUN npm install --production=false COPY packages/objectloader . RUN npm run build +# this whole thing is required cause npm 6.* doesn't allow for pack output dir specification +RUN mkdir /packages +# invoke npm pack and move its result to the packages folder when done +RUN mv $(npm pack) /packages/ WORKDIR /opt/viewer COPY packages/viewer/package*.json ./ -RUN npm install ../objectloader +# this installs objectloader from a tarball +RUN npm i $(find /packages -type f -name "speckle*.tgz") # Install dependencies and devDependencies RUN npm install --production=false COPY packages/viewer . RUN npm run build +RUN mv $(npm pack) /packages/ + +FROM node:14.16-buster-slim as build-stage WORKDIR /opt/preview-service +COPY --from=deps-build /packages /packages COPY packages/preview-service/package*.json ./ -RUN npm install ../objectloader && rm -rf ../objectloader/node_modules -RUN npm install ../viewer && rm -rf ../viewer/node_modules +# this installs viewer and objectloader from a tarball +RUN npm i $(find /packages -type f -name "speckle*.tgz") RUN npm ci --production=false COPY packages/preview-service . RUN npm run build-fe - - FROM node:14.16-buster-slim as node RUN apt-get update && apt-get install -y \ @@ -48,8 +55,6 @@ RUN chmod +x /wait ARG NODE_ENV=production ENV NODE_ENV=${NODE_ENV} -COPY --from=build-stage /opt/objectloader /opt/objectloader -COPY --from=build-stage /opt/viewer /opt/viewer COPY --from=build-stage /opt/preview-service /opt/preview-service WORKDIR /opt/preview-service