Dockerfile 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # syntax = docker/dockerfile:1.4
  2. ARG OPT_DIR="/opt"
  3. ARG PNPM_HOME="/root/.local/share/pnpm"
  4. ##
  5. ## base
  6. ##
  7. FROM node:20-slim AS base
  8. ARG OPT_DIR
  9. ARG PNPM_HOME
  10. WORKDIR $OPT_DIR
  11. # install tools
  12. RUN --mount=type=cache,target=/var/lib/apt,sharing=locked \
  13. --mount=type=cache,target=/var/cache/apt,sharing=locked \
  14. apt-get update && apt-get install -y ca-certificates wget --no-install-recommends
  15. # install pnpm
  16. RUN wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" PNPM_VERSION="10.4.1" sh -
  17. ENV PNPM_HOME=$PNPM_HOME
  18. ENV PATH="$PNPM_HOME:$PATH"
  19. # install turbo
  20. RUN --mount=type=cache,target=$PNPM_HOME/store,sharing=locked \
  21. pnpm add turbo --global
  22. ##
  23. ## builder
  24. ##
  25. FROM base AS builder
  26. ENV PNPM_HOME=$PNPM_HOME
  27. ENV PATH="$PNPM_HOME:$PATH"
  28. WORKDIR $OPT_DIR
  29. COPY . .
  30. RUN --mount=type=cache,target=$PNPM_HOME/store,sharing=locked \
  31. pnpm install ---frozen-lockfile
  32. # build
  33. RUN turbo run clean
  34. RUN turbo run build --filter @growi/pdf-converter
  35. # make artifacts
  36. RUN pnpm deploy out --prod --filter @growi/pdf-converter
  37. RUN rm -rf apps/pdf-converter/node_modules && mv out/node_modules apps/pdf-converter/node_modules
  38. RUN tar -zcf /tmp/packages.tar.gz \
  39. package.json \
  40. apps/pdf-converter/package.json \
  41. apps/pdf-converter/dist \
  42. apps/pdf-converter/.env \
  43. apps/pdf-converter/node_modules
  44. ##
  45. ## release
  46. ##
  47. FROM node:20-slim
  48. LABEL maintainer="Yuki Takei <yuki@weseek.co.jp>"
  49. ARG OPT_DIR
  50. ENV NODE_ENV="production"
  51. ENV PUPPETEER_EXECUTABLE_PATH="/usr/bin/chromium"
  52. ENV LANG="ja_JP.UTF-8"
  53. ENV appDir="$OPT_DIR/pdf-converter"
  54. RUN --mount=type=cache,target=/var/lib/apt,sharing=locked \
  55. --mount=type=cache,target=/var/cache/apt,sharing=locked \
  56. apt-get update; \
  57. apt-get install -y chromium fonts-lato fonts-ipafont-gothic fonts-noto-cjk gosu; \
  58. rm -rf /var/lib/apt/lists/*; \
  59. # verify that the binary works
  60. gosu nobody true
  61. # extract artifacts as 'node' user
  62. USER node
  63. WORKDIR ${appDir}
  64. RUN --mount=type=bind,from=builder,source=/tmp/packages.tar.gz,target=/tmp/packages.tar.gz \
  65. tar -zxf /tmp/packages.tar.gz -C ${appDir}/
  66. COPY --chown=node:node --chmod=700 apps/pdf-converter/docker/docker-entrypoint.sh /
  67. USER root
  68. WORKDIR ${appDir}/apps/pdf-converter
  69. EXPOSE 3010
  70. ENTRYPOINT ["/docker-entrypoint.sh"]