Dockerfile 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. # syntax = docker/dockerfile:1.4
  2. ##
  3. ## base
  4. ##
  5. FROM node:20-slim AS base
  6. ENV optDir /opt
  7. WORKDIR ${optDir}
  8. # install pnpm
  9. RUN apt-get update && apt-get install -y ca-certificates wget --no-install-recommends \
  10. && wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh -
  11. ENV PNPM_HOME "/root/.local/share/pnpm"
  12. ENV PATH "$PNPM_HOME:$PATH"
  13. # install turbo
  14. RUN pnpm add turbo --global
  15. ##
  16. ## partialrepos
  17. ##
  18. FROM base AS partialrepos
  19. ENV optDir /opt
  20. WORKDIR ${optDir}
  21. COPY . .
  22. RUN turbo prune @growi/slackbot-proxy --docker
  23. ##
  24. ## deps-resolver
  25. ##
  26. FROM base AS deps-resolver
  27. ENV optDir /opt
  28. WORKDIR ${optDir}
  29. # copy files
  30. COPY --from=partialrepos ${optDir}/out/json/ .
  31. COPY --from=partialrepos ${optDir}/out/pnpm-lock.yaml ./pnpm-lock.yaml
  32. RUN pnpm add node-gyp --global
  33. RUN pnpm install --no-frozen-lockfile
  34. # make artifacts
  35. RUN tar -cf node_modules.tar \
  36. node_modules \
  37. apps/*/node_modules \
  38. packages/*/node_modules
  39. ##
  40. ## deps-resolver-prod
  41. ##
  42. FROM deps-resolver AS deps-resolver-prod
  43. RUN pnpm install --no-frozen-lockfile --prod
  44. # make artifacts
  45. RUN tar -zcf node_modules.tar.gz \
  46. node_modules \
  47. apps/*/node_modules \
  48. packages/*/node_modules
  49. ##
  50. ## builder
  51. ##
  52. FROM base AS builder
  53. ENV optDir /opt
  54. WORKDIR ${optDir}
  55. RUN yarn global add turbo
  56. # copy files
  57. COPY --from=partialrepos ${optDir}/out/full/ .
  58. COPY --from=partialrepos ${optDir}/out/pnpm-lock.yaml ./pnpm-lock.yaml
  59. COPY ["tsconfig.base.json", "./"]
  60. # copy dependent packages
  61. COPY --from=deps-resolver \
  62. ${optDir}/node_modules.tar ${optDir}/
  63. # extract node_modules.tar
  64. RUN tar -xf node_modules.tar
  65. RUN rm node_modules.tar
  66. # build
  67. RUN turbo run build
  68. # make artifacts
  69. RUN tar -zcf packages.tar.gz \
  70. package.json \
  71. apps/*/package.json \
  72. apps/*/dist \
  73. apps/*/.env \
  74. packages/*/package.json \
  75. packages/*/dist
  76. ##
  77. ## release
  78. ##
  79. FROM node:20-slim
  80. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  81. ENV NODE_ENV production
  82. ENV optDir /opt
  83. ENV appDir ${optDir}/slackbot-proxy
  84. # copy artifacts
  85. COPY --from=deps-resolver-prod --chown=node:node \
  86. ${optDir}/node_modules.tar.gz ${appDir}/
  87. COPY --from=builder --chown=node:node \
  88. ${optDir}/packages.tar.gz ${appDir}/
  89. # extract artifacts as 'node' user
  90. USER node
  91. WORKDIR ${appDir}
  92. RUN tar -xf node_modules.tar.gz \
  93. && tar -xf packages.tar.gz \
  94. && rm node_modules.tar.gz packages.tar.gz
  95. WORKDIR ${appDir}/apps/slackbot-proxy
  96. EXPOSE 8080
  97. CMD ["node", "-r", "dotenv-flow/config", "dist/index.js"]