Node.js Docker file 만들기 모범 사례

개시하다


여러분, 노드.js 사용하셨어요?
저는 다양한 제품 중에서 노드입니다.Docker 컨테이너로 js를 운용했는데 그중에서 스스로 찾았어요. Node.js 컨테이너 환경을 만들 때의 자신의 최상의 실천을 공유하다

여러 가지 요점


1. 멀티스테이지 build을 이용하여 용기 이미지 줄이기


용기의 내용이 작을수록 이상적이다.
요즘은 노드.TypeScript 이 정도 TypeScript는 당연히 이용됐겠죠.
TypeScript는 실제 소스 코드.ts 파일 Build 이후.js를 실행하는 구조입니다.
실행할 때 파일.ts이 필요하지 않기 때문에 파일이 없는 상태에서 용기 이미지를 만드는 것이 좋습니다.
하지만 Build가 만든 물건을 특별히 Docker 컨테이너에 넣는 것은 매우 번거롭다.
따라서 Docker의 multi stage build 기능을 사용합니다.multi stage build는 Docker Image의 스테이지를 분리한 후 최종적으로 사용하는 컨테이너 이미지가 그 단계에서만 사용할 수 있는 기능을 말한다.

2. Production dependencies만 설치

npmyarn에서 관리되는 패키지는 package.json에 기재되어 있습니다.
그중에서도 다음과 같은 몇 개의 캐릭터로 나뉜다.dependencies↑ 실행시 사용하는 포장devDependencies↑ 개발에만 사용되는 패키지(typescript,lint 등)npm install를 진행할 때 추가—production 옵션을 통해 dependencies에 기재된 가방만 설치하기 때문에 옵션을 지정하여 Production dependncies만 설치하여 최종 용기 이미지를 경감시킵니다.

3. 실행 환경에서 가벼운 이미지 사용하기


용기의 이미지를 조금이나마 덜어주기 위해 가볍고 가벼운 이미지를 사용하세요.
샘플은 node:14.16.1-alpinedistroless 같은 것을 사용하는 것이 비교적 이상적이다.

4. ** .dockerignore 파일을 올바르게 설정합니다.


창고에 dockerimage를 생성하는 데 필요하지 않은 파일이 몇 개 있습니다..dockerignore 필요하지 않은 파일을 정의하고 제외합니다.
build에서 생성된 node_modulesdist 파일 등도 미리 정의해야 한다.
**/node_modules/
**/.git
**/dist/

5. 루트 사용자에서 시작 중지


루트 사용자가 실행하는 경우 안전에 있어서 예상치 못한 고장과 취약성을 일으킬 수 있으므로 정의USER는 이 사용자가 수행하도록 하겠습니다.
USER node

6.npm 명령node.일어설 수 없다


대부분의 프레임워크가 기본적으로 시작 명령 npm start 을 설정했다고 생각합니다.
그러나 npm 명령은 신호를 Node로 바꿉니다.jsGraceful Shutdown로 전송할 수 없기 때문에 실행할 수 없습니다.
따라서tini를 설치하려면 docker--init 옵션을 사용하여 회피합니다.
## PID1問題に対応する
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]

USER node

EXPOSE 3000

ENV NODE_ENV prod

## 実行コマンドは npm ではなく node を直接実行。
CMD ["node", "dist/src/main"]

최종 Docker File


## パッケージのインストール
FROM node:14.16.1-alpine as desp-stage
WORKDIR /app

COPY ./package.json ./package-lock.json ./
RUN npm install --production --no-progress

## buildを実行
FROM node:14.16.1-alpine as build-stage

WORKDIR /work

COPY . /work/

RUN npm install --no-progress

RUN npm run lint

RUN npm run build

## runtime環境を作成
FROM node:14.16.1-alpine as runtime-stage

ENV LANG C.UTF-8
ENV TZ Asia/Tokyo

WORKDIR /app

COPY ./package.json ./package-lock.json ./
COPY --from=desp-stage /app/node_modules ./node_modules
COPY --from=build-stage /work/dist ./dist

## PID1問題に対応する
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]

USER node

EXPOSE 3000

ENV NODE_ENV prod

CMD ["node", "dist/src/main"]

총결산


이번에는 노드다.js에서 Docker file을 제작할 때 고려할 사항을 요약했습니다.
다만 아무래도 구축됐더라도 당연히 작동하겠지만, 컨테이너 기술의 맛을 최대한 살려 제대로 활용했으면 좋겠다.
많은 것을 시도해 보았지만 결국 자신의 최상의 해결 방안에 이르렀다 63?그렇다면 토크가 있다면 꼭 댓글을 달아주세요.

좋은 웹페이지 즐겨찾기