본문으로 건너뛰기
버전: 8.x

pnpm fetch

lockfile에서 가상 저장소로 패키지를 가져오면 패키지 매니페스트 파일이 무시됩니다.

사용 시나리오

이 명령은 도커 이미지 빌드를 향상하기 위해 특별히 설계되었습니다.

You may have read the official guide to writing a Dockerfile for a Node.js app, if you haven't read it yet, you may want to read it first.

이 가이드에서 pnpm을 사용하여 프로젝트에 최적화된 Dockerfile을 작성하는 방법을 배웁니다.

FROM node:14

WORKDIR /path/to/somewhere

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

WORKDIR /path/to/somewhere

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

WORKDIR /path/to/somewhere

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, -D

개발 패키지만 가져옵니다.

--prod, -P

개발 패키지를 가져오지 않습니다.