8.5 배포시 의존성을 제거해라

고준영·2021년 12월 6일
0

Nodebestpractices

목록 보기
15/16
post-thumbnail

8.5 배포시 의존성을 제거해라

한문단 요약

개발 종속성은 잠재적인 보안 취약점과 컨테이너의 크기를 크게 증가시킨다.
예를들어, 가장 영햘도 있는 npm 보안 침해 중 일부는 eslint-scope 또는 event-stream that was used by nodemon과 같은 영향을 받는 패키지개발의존성에서 시작했다. 이러한 이유로 인해 최종적으로 배포되는 이미지는 안전하고 최소화 되어야 한다. --production플래그와 함께 npm install을 하는것이 가장 좋다. 그러나, 새로운 설치와 잠금 파일의 존재를 보장하는 npm ci를 실행하는 것이 훨씬 더 안전하다. 로컬 캐시를 제거하면 수십MB를 추가로 절약할 수 있다. 종종 개발의존성을 사용하여 컨테이너 내에서 테스트를 하거나 디버깅을 해야 할 필요가 있는데 multi stage builds가 서로 다른 종속성 세트와 배포용 종속성 세트를 갖는데 도움이 될 수 있다.

npm ci(Contiuouse Integration)
npm 블로그에 따르면 npm install 보다 두배 빠르다
npm install 은 package.json을 참고
npm ci는 package-lock.json을 참고한다

package-lock.json 등의 lockfile을 기준으로 package를 설치하게 되어 있으므로, 규모가 큰 조직에서 package에 대한 lockfile이 승인되면, npm ci를 활용하여 package-lock.json에 명시되어 있는 패키지를 설치하도록 한다.

만약, package.json내의 파일과 package-lock.json 내의 버전 등이 다르면, package-lock.json을 기준으로 package.json 파일을 수정하며, 명시되지 않은 부분에서는 오류를 발생

예시 코드 – 배포를 위한 설치

Dockerfile
FROM node:12-slim AS build

WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci --production && npm cache clean --force

/# 나머지 코드는 여기서 부터 작성하면 된다/



예시 코드 – 여러 단계로 이루어진 빌드의 배포를 위한 설치

Dockerfile
FROM node:14.8.0-alpine AS build

COPY --chown=node:node package.json package-lock.json ./
/# ✅ 안전한 설치/
RUN npm ci
COPY --chown=node:node src ./src
RUN npm run build


/# 런타임 단계/
FROM node:14.8.0-alpine

COPY --chown=node:node --from=build package.json package-lock.json ./
COPY --chown=node:node --from=build node_modules ./node_modules
COPY --chown=node:node --from=build dist ./dist

/# ✅ 깔끔한 개발 패키지/
RUN npm prune --production

CMD [ "node", "dist/app.js" ]
> `npm prune`사용하지 않는 npm module 삭제

안티 패턴 예시 코드 – 모든 의존성을 하나의 dockerfile로 설치

Dockerfile
FROM node:12-slim AS build

WORKDIR /usr/src/app
COPY package.json package-lock.json ./
/# 두 가지 실수: 개발 의존성 설치, npm 설치 후 캐시 미삭제/
RUN npm install

/# 나머지 코드는 여기서 부터 작성하면 된다/



블로그 인용: “npm ci 는 일반적인 설치보다 엄격하다”

npm 공식 문서로 부터

/> This command is similar to npm-install,/
테스트 플랫폼 또는 CI/CD와 같은 자동화된 환경에서 사용하는 것 또는 종속성을 새로 설치하고 있는지 확인하려는 상황을 제외하고. 이 명령어는 npm-install과 유사하다. 특정 사용자가 지향하는 기능을 건너뛰면 일반 npm 설치보다 훨씬 빠를 수 있다. 또한 일반적인 설치보다 더욱 엄격하므로 대부분의 npm 사용자가 로컬 환경에서 하는 설치로 인한 오류나 불일치를 포착하는데 도움이 된다.

Dockerfile CMD
CMD [“node”, ”index.js”] -> exec form
참조 프로세스 없이 명령을 있는 그대로 실행 Node.js app이 PID 1로 실행

CMD node index.js -> shell form
쉘 형식을 사용하면 도커는 app을 시작하기 전에 쉘 명령어를 호출한다.
명령어를 실행하기 전에 /bin/sh -c 실행
따라서
CMD [“/bin/sh”, “-c”, “node”, “index.js”]

profile
코드짜는귤🍊 풀스택을 지향하는 주니어 개발자 입니다🧡

0개의 댓글

관련 채용 정보