Dockerfile 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. # syntax = docker/dockerfile:experimental
  2. ARG flavor=default
  3. ##
  4. ## deps-resolver
  5. ##
  6. FROM node:12-slim AS deps-resolver
  7. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  8. ENV appDir /opt/growi
  9. COPY ./package.json ${appDir}/
  10. COPY ./yarn.lock ${appDir}/
  11. WORKDIR ${appDir}
  12. # setup
  13. RUN yarn config set network-timeout 300000
  14. RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \
  15. yarn
  16. # install official plugins
  17. RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \
  18. yarn add growi-plugin-lsx growi-plugin-pukiwiki-like-linker growi-plugin-attachment-refs
  19. # install peerDependencies
  20. RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \
  21. yarn add -D react-images react-motion
  22. ##
  23. ## prebuilder-default
  24. ##
  25. FROM node:12-slim AS prebuilder-default
  26. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  27. ENV appDir /opt/growi
  28. COPY . ${appDir}
  29. ##
  30. ## prebuilder-nocdn
  31. ##
  32. FROM prebuilder-default AS prebuilder-nocdn
  33. # replace env.prod.js for NO_CDN
  34. COPY docker/nocdn/env.prod.js ${appDir}/config/
  35. ##
  36. ## builder
  37. ##
  38. FROM prebuilder-${flavor} AS builder
  39. ENV appDir /opt/growi
  40. COPY --from=deps-resolver ${appDir}/node_modules ${appDir}/node_modules
  41. WORKDIR ${appDir}
  42. # build
  43. RUN yarn build:prod
  44. # shrink dependencies for production
  45. RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \
  46. yarn install --production
  47. # remove unnecessary files
  48. WORKDIR /tmp
  49. RUN --mount=target=. sh docker/bin/remove-unnecessary-files.sh
  50. WORKDIR ${appDir}
  51. ##
  52. ## release
  53. ##
  54. FROM node:12-alpine
  55. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  56. ENV appDir /opt/growi
  57. # install tini
  58. RUN --mount=type=cache,target=/var/cache/apk \
  59. apk add tini
  60. COPY docker/docker-entrypoint.sh /
  61. COPY --from=builder --chown=node:node \
  62. ${appDir} ${appDir}
  63. WORKDIR ${appDir}
  64. USER node
  65. VOLUME /data
  66. EXPOSE 3000
  67. ENTRYPOINT ["/docker-entrypoint.sh"]
  68. CMD ["yarn", "server:prod"]