Dockerfile 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # syntax = docker/dockerfile:1.2
  2. ##
  3. ## deps-resolver-base
  4. ##
  5. FROM node:14-slim AS deps-resolver-base
  6. ENV appDir /opt
  7. WORKDIR ${appDir}
  8. COPY ./package.json ./
  9. COPY ./yarn.lock ./
  10. COPY ./lerna.json ./
  11. COPY ./packages/slack/package.json ./packages/slack/package.json
  12. COPY ./packages/slackbot-proxy/package.json ./packages/slackbot-proxy/package.json
  13. # setup
  14. RUN yarn config set network-timeout 300000
  15. ##
  16. ## deps-resolver-dev
  17. ##
  18. FROM deps-resolver-base AS deps-resolver-dev
  19. RUN npx lerna bootstrap
  20. # make artifacts
  21. RUN tar cf node_modules.tar node_modules \
  22. packages/slackbot-proxy/node_modules \
  23. packages/slack/node_modules
  24. ##
  25. ## deps-resolver-prod
  26. ##
  27. FROM deps-resolver-base AS deps-resolver-prod
  28. RUN npx lerna bootstrap -- --production
  29. # make artifacts
  30. RUN tar cf dependencies.tar node_modules packages/slackbot-proxy/node_modules
  31. ##
  32. ## builder
  33. ##
  34. FROM node:14-slim AS builder
  35. ENV appDir /opt
  36. WORKDIR ${appDir}
  37. # copy dependent packages
  38. COPY --from=deps-resolver-dev \
  39. ${appDir}/node_modules.tar ${appDir}/
  40. # extract node_modules.tar
  41. RUN tar xf node_modules.tar
  42. RUN rm node_modules.tar
  43. COPY ./package.json ./
  44. COPY ./lerna.json ./
  45. COPY ./tsconfig.base.json ./
  46. # copy all related packages
  47. COPY packages/slack packages/slack
  48. COPY packages/slackbot-proxy packages/slackbot-proxy
  49. # build
  50. RUN yarn lerna run build
  51. # make artifacts
  52. RUN tar cf packages.tar \
  53. packages/slack/package.json \
  54. packages/slack/dist \
  55. packages/slackbot-proxy/package.json \
  56. packages/slackbot-proxy/.env \
  57. packages/slackbot-proxy/dist
  58. ##
  59. ## release
  60. ##
  61. FROM node:14-slim
  62. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  63. ENV NODE_ENV production
  64. ENV appDir /opt
  65. # copy artifacts
  66. COPY --from=deps-resolver-prod --chown=node:node \
  67. ${appDir}/dependencies.tar ${appDir}/
  68. COPY --from=builder --chown=node:node \
  69. ${appDir}/packages.tar ${appDir}/
  70. RUN chown node:node ${appDir}
  71. USER node
  72. # extract artifacts
  73. WORKDIR ${appDir}
  74. RUN tar xf dependencies.tar
  75. RUN tar xf packages.tar
  76. RUN rm dependencies.tar packages.tar
  77. WORKDIR ${appDir}/packages/slackbot-proxy
  78. EXPOSE 8080
  79. CMD ["node", "-r", "dotenv-flow/config", "dist/index.js"]