Dockerfile 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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 \
  31. node_modules \
  32. packages/slack/node_modules \
  33. packages/slackbot-proxy/node_modules
  34. ##
  35. ## builder
  36. ##
  37. FROM node:14-slim AS builder
  38. ENV appDir /opt
  39. WORKDIR ${appDir}
  40. # copy dependent packages
  41. COPY --from=deps-resolver-dev \
  42. ${appDir}/node_modules.tar ${appDir}/
  43. # extract node_modules.tar
  44. RUN tar xf node_modules.tar
  45. RUN rm node_modules.tar
  46. COPY ./package.json ./
  47. COPY ./lerna.json ./
  48. COPY ./tsconfig.base.json ./
  49. # copy all related packages
  50. COPY packages/slack packages/slack
  51. COPY packages/slackbot-proxy packages/slackbot-proxy
  52. # build
  53. RUN yarn lerna run build
  54. # make artifacts
  55. RUN tar cf packages.tar \
  56. packages/slack/package.json \
  57. packages/slack/dist \
  58. packages/slackbot-proxy/package.json \
  59. packages/slackbot-proxy/.env \
  60. packages/slackbot-proxy/dist
  61. ##
  62. ## release
  63. ##
  64. FROM node:14-slim
  65. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  66. ENV NODE_ENV production
  67. ENV appDir /opt
  68. # copy artifacts
  69. COPY --from=deps-resolver-prod --chown=node:node \
  70. ${appDir}/dependencies.tar ${appDir}/
  71. COPY --from=builder --chown=node:node \
  72. ${appDir}/packages.tar ${appDir}/
  73. RUN chown node:node ${appDir}
  74. USER node
  75. # extract artifacts
  76. WORKDIR ${appDir}
  77. RUN tar xf dependencies.tar
  78. RUN tar xf packages.tar
  79. RUN rm dependencies.tar packages.tar
  80. WORKDIR ${appDir}/packages/slackbot-proxy
  81. EXPOSE 8080
  82. CMD ["node", "-r", "dotenv-flow/config", "dist/index.js"]