# syntax = docker/dockerfile:experimental ARG flavor=default ## ## deps-resolver ## FROM node:12-slim AS deps-resolver LABEL maintainer Yuki Takei ENV appDir /opt/growi COPY ./package.json ${appDir}/ COPY ./yarn.lock ${appDir}/ WORKDIR ${appDir} # setup RUN yarn config set network-timeout 300000 RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \ yarn # install official plugins RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \ yarn add growi-plugin-lsx growi-plugin-pukiwiki-like-linker growi-plugin-attachment-refs # install peerDependencies RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \ yarn add -D react-images react-motion ## ## prebuilder-default ## FROM node:12-slim AS prebuilder-default LABEL maintainer Yuki Takei ENV appDir /opt/growi COPY --from=deps-resolver ${appDir}/node_modules ${appDir}/node_modules COPY . ${appDir}/ WORKDIR ${appDir} ## ## prebuilder-nocdn ## FROM prebuilder-default AS prebuilder-nocdn # replace env.prod.js for NO_CDN COPY nocdn/env.prod.js config ## ## builder ## FROM prebuilder-${flavor} AS builder ENV appDir /opt/growi # build RUN yarn build:prod # shrink dependencies for production RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \ yarn install --production # remove unnecessary files WORKDIR /tmp RUN --mount=target=. sh docker/bin/remove-unnecessary-files.sh WORKDIR ${appDir} ## ## release ## FROM node:12-alpine LABEL maintainer Yuki Takei ENV appDir /opt/growi # install tini RUN --mount=type=cache,target=/var/cache/apk \ apk add tini COPY --from=builder --chown=node:node ${appDir} ${appDir} # create symlink for FILE_UPLOAD=local WORKDIR /tmp RUN --mount=target=. sh docker/bin/symlink-for-uploading-to-local.sh WORKDIR ${appDir} USER node VOLUME /data EXPOSE 3000 ENTRYPOINT ["/sbin/tini", "-e", "143", "--"] CMD ["yarn", "server:prod"]