개발 종속성은 잠재적인 보안 취약점과 컨테이너의 크기를 크게 증가시킨다.
예를들어, 가장 영햘도 있는 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 파일을 수정하며, 명시되지 않은 부분에서는 오류를 발생
FROM node:12-slim AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm ci --production && npm cache clean --force
/# 나머지 코드는 여기서 부터 작성하면 된다/
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 삭제
FROM node:12-slim AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
/# 두 가지 실수: 개발 의존성 설치, npm 설치 후 캐시 미삭제/
RUN npm install
/# 나머지 코드는 여기서 부터 작성하면 된다/
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”]