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

pnpm fetch

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

danger

이것은 실험적인 명령입니다. 주요 변경 사항은 CLI의 비주요 버전에 도입될 수 있습니다.

사용 시나리오

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

Node.js 여러분은 앱용 Dockerfile 작성에 대한 공식 가이드를 읽었을 수도 있습니다. 아직 읽지 않았다면 먼저 읽어보는 것이 좋습니다.

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

FROM node:14

RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm

# pnpm install에 필요한 파일
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./

RUN pnpm install --frozen-lockfile --prod

# 번들 앱 소스
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

# 설치를 위해 필요한 파일
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./

# 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
# 하나의 명령어만으로 도커는 package.json을 걸러낼 수 없기 때문에 각 서브 패키지에 대해 매니페스트를 올바른 위치로 복사하기 위한 여분의 명령어를 추가해야 합니다.
COPY packages/foo/package.json packages/foo/
COPY packages/bar/package.json packages/bar/

RUN pnpm install --frozen-lockfile --prod

# 앱 소스 번들
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는 lockfile만 필요합니다.
COPY pnpm-lock.yaml ./

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

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