Dockerfile 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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@1.0.0 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 --from=deps-resolver ${appDir}/node_modules ${appDir}/node_modules
  36. # copy all files except the files listed in Dockerfile.dockerignore
  37. COPY . ${appDir}
  38. # overwirte package.json and yarn.lock
  39. COPY --from=deps-resolver ${appDir}/package.json ${appDir}/package.json
  40. COPY --from=deps-resolver ${appDir}/yarn.lock ${appDir}/yarn.lock
  41. ##
  42. ## prebuilder-nocdn
  43. ##
  44. FROM prebuilder-default AS prebuilder-nocdn
  45. # replace env.prod.js for NO_CDN
  46. COPY docker/nocdn/env.prod.js ${appDir}/config/
  47. ##
  48. ## builder
  49. ##
  50. FROM prebuilder-${flavor} AS builder
  51. ENV appDir /opt/growi
  52. WORKDIR ${appDir}
  53. # build
  54. RUN --mount=type=cache,target=./node_modules/.cache \
  55. yarn build:prod
  56. # remove except artifacts
  57. WORKDIR /tmp
  58. RUN --mount=target=. sh docker/bin/remove-except-artifacts.sh
  59. WORKDIR ${appDir}
  60. ##
  61. ## release
  62. ##
  63. FROM node:12-alpine
  64. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  65. ENV appDir /opt/growi
  66. # install tini
  67. RUN --mount=type=cache,target=/var/cache/apk \
  68. apk add tini su-exec
  69. COPY docker/docker-entrypoint.sh /
  70. RUN chmod 700 /docker-entrypoint.sh
  71. COPY --from=deps-resolver-prod --chown=node:node \
  72. ${appDir}/node_modules ${appDir}/node_modules
  73. COPY --from=builder --chown=node:node \
  74. ${appDir} ${appDir}
  75. WORKDIR ${appDir}
  76. VOLUME /data
  77. EXPOSE 3000
  78. ENTRYPOINT ["/sbin/tini", "-e", "143", "--", "/docker-entrypoint.sh"]
  79. CMD ["yarn", "server:prod"]