Dockerfile 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. ## builder
  17. ##
  18. FROM base AS builder
  19. ENV optDir /opt
  20. WORKDIR ${optDir}
  21. COPY . .
  22. RUN pnpm add node-gyp --global
  23. RUN pnpm install ---frozen-lockfile
  24. # build
  25. RUN turbo run clean
  26. RUN turbo run build --filter @growi/app
  27. # make artifacts
  28. RUN pnpm deploy out --prod --filter @growi/app
  29. RUN rm -rf apps/app/node_modules && mv out/node_modules apps/app/node_modules
  30. RUN rm -rf apps/app/.next/cache
  31. RUN tar -zcf packages.tar.gz \
  32. package.json \
  33. apps/app/.next \
  34. apps/app/config \
  35. apps/app/dist \
  36. apps/app/public \
  37. apps/app/resource \
  38. apps/app/tmp \
  39. apps/app/.env.production* \
  40. apps/app/next.config.js \
  41. apps/app/package.json \
  42. apps/app/node_modules
  43. ##
  44. ## release
  45. ##
  46. FROM node:20-slim
  47. LABEL maintainer Yuki Takei <yuki@weseek.co.jp>
  48. ENV NODE_ENV production
  49. ENV optDir /opt
  50. ENV appDir ${optDir}/growi
  51. # Add gosu
  52. # see: https://github.com/tianon/gosu/blob/1.13/INSTALL.md
  53. RUN set -eux; \
  54. apt-get update; \
  55. apt-get install -y gosu; \
  56. rm -rf /var/lib/apt/lists/*; \
  57. # verify that the binary works
  58. gosu nobody true
  59. # Add pnpm for 'node' user
  60. RUN apt-get update && apt-get install -y sudo ca-certificates wget --no-install-recommends \
  61. && wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sudo -u node sh - \
  62. && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false
  63. ENV PNPM_HOME="/home/node/.local/share/pnpm"
  64. ENV PATH "$PNPM_HOME:$PATH"
  65. COPY --from=builder --chown=node:node \
  66. ${optDir}/packages.tar.gz ${appDir}/
  67. # extract artifacts as 'node' user
  68. USER node
  69. WORKDIR ${appDir}
  70. RUN tar -zxf packages.tar.gz && rm packages.tar.gz
  71. COPY --chown=node:node --chmod=700 apps/app/docker/docker-entrypoint.sh /
  72. USER root
  73. WORKDIR ${appDir}/apps/app
  74. VOLUME /data
  75. EXPOSE 3000
  76. ENTRYPOINT ["/docker-entrypoint.sh"]
  77. CMD ["pnpm run migrate && node -r dotenv-flow/config --expose_gc dist/server/app.js"]