Dockerfile 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. ## deps-resolver-prod
  24. ##
  25. FROM deps-resolver AS deps-resolver-prod
  26. # shrink dependencies for production
  27. RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \
  28. yarn install --production
  29. ##
  30. ## prebuilder-default
  31. ##
  32. FROM node:12-slim AS prebuilder-default
  33. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  34. ENV appDir /opt/growi
  35. COPY bin ${appDir}/bin
  36. COPY config ${appDir}/config
  37. COPY public ${appDir}/public
  38. COPY resource ${appDir}/resource
  39. COPY src ${appDir}/src
  40. COPY tmp ${appDir}/tmp
  41. COPY babel.config.js package.json yarn.lock ${appDir}/
  42. COPY *.md LICENSE ${appDir}/
  43. ##
  44. ## prebuilder-nocdn
  45. ##
  46. FROM prebuilder-default AS prebuilder-nocdn
  47. # replace env.prod.js for NO_CDN
  48. COPY docker/nocdn/env.prod.js ${appDir}/config/
  49. ##
  50. ## builder
  51. ##
  52. FROM prebuilder-${flavor} AS builder
  53. ENV appDir /opt/growi
  54. COPY --from=deps-resolver ${appDir}/node_modules ${appDir}/node_modules
  55. WORKDIR ${appDir}
  56. # build
  57. RUN yarn build:prod
  58. # remove unnecessary files
  59. RUN rm -rf bin
  60. RUN rm -rf node_modules
  61. RUN rm -rf src/client src/linter-checker src/test
  62. RUN rm -rf babel.config.js
  63. ##
  64. ## release
  65. ##
  66. FROM node:12-alpine
  67. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  68. ENV appDir /opt/growi
  69. # install tini
  70. RUN --mount=type=cache,target=/var/cache/apk \
  71. apk add tini
  72. COPY docker/docker-entrypoint.sh /
  73. COPY --from=deps-resolver-prod --chown=node:node \
  74. ${appDir}/node_modules ${appDir}/node_modules
  75. COPY --from=builder --chown=node:node \
  76. ${appDir} ${appDir}
  77. WORKDIR ${appDir}
  78. USER node
  79. VOLUME /data
  80. EXPOSE 3000
  81. ENTRYPOINT ["/docker-entrypoint.sh"]
  82. CMD ["yarn", "server:prod"]