pnpm fetch
lockfile에서 가상 저장소로 패키지를 가져오면 패키지 매니페스트 파일이 무시됩니다.
사용 시나리오
이 명령은 도커 이미지 빌드를 향상하기 위해 특별히 설계되었습니다.
Node.js 여러분은 앱용 Dockerfile 작성에 대한 공식 가이드를 읽었을 수도 있습니다. 아직 읽지 않았다면 먼저 읽어보는 것이 좋습니다.
이 가이드에서 pnpm을 사용하여 프로젝트에 최적화된 Dockerfile을 작성하는 방법을 배웁니다.
FROM node:14
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# Files required by pnpm install
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./
# If you patched any package, include patches before install too
COPY patches patches
RUN pnpm install --frozen-lockfile --prod
# Bundle app source
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
.npmrc
, package.json
, pnpm-lock.yaml
, .pnpmfile.cjs
에 대한 변경 사항이 없는 한 도커 빌드 캐시는 RUN pnpm install --frozen-lockfile --prod
레이어까지 계속 유효합니다. 이는 도커 이미지를 빌드할 때 대부분의 시간을 차지합니다.
그러나 package.json
에 대한 수정은 의존성을 포함할 뿐만 아니라 다른 도구에 대한 버전 번호, 스크립트 및 임의 구성을 포함할 수 있기 때문에 예상했던 보다 훨씬 더 자주 발생할 수 있습니다.
monorepo 프로젝트를 빌드하는 Dockerfile을 유지 관리하는 것도 어렵습니다. 다음과 같이 보일 수 있습니다.
FROM node:14
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# Files required by pnpm install
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./
# If you patched any package, include patches before install too
COPY patches patches
# for each sub-package, we have to add one extra step to copy its manifest
# to the right place, as docker have no way to filter out only package.json with
# single instruction
COPY packages/foo/package.json packages/foo/
COPY packages/bar/package.json packages/bar/
RUN pnpm install --frozen-lockfile --prod
# Bundle app source
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
보시다시피 하위 패키지를 추가하거나 제거할 때 Dockerfile을 업데이트해야 합니다.
pnpm fetch
는 lockfile의 정보만으로 가상 저장소로 패키지를 가져오는 기능 를 제공하여 위의 문제를 완벽하게 해결합니다.
FROM node:14
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# pnpm fetch does require only lockfile
COPY pnpm-lock.yaml ./
# If you patched any package, include patches before running pnpm fetch
COPY patches patches
RUN pnpm fetch --prod
ADD . ./
RUN pnpm install -r --offline --prod
EXPOSE 8080
CMD [ "node", "server.js" ]
간단한 프로젝트와 monorepo 프로젝트 모두에서 작동합니다. --offline
필요한 모든 패키지가 가상 저장소에 이미 있어야 하므로 pnpm이 패키지 레지스트리와 통신하지 않도록 강제합니다.
lockfile이 변경되지 않는 한 빌드 캐시는 RUN pnpm install -r --offline --prod
레이어까지 유효하므로 시간을 훨씬 절약할 수 있습니다.
옵션
--dev
개발 패키지만 가져옵니다.
--prod
개발 패키지를 가져오지 않습니다.