Node.js Docker file 만들기 모범 사례
8420 단어 Node.jsnpmDockerfiletech
개시하다
여러분, 노드.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만 설치
npm
및 yarn
에서 관리되는 패키지는 package.json
에 기재되어 있습니다.그중에서도 다음과 같은 몇 개의 캐릭터로 나뉜다.
dependencies
↑ 실행시 사용하는 포장devDependencies
↑ 개발에만 사용되는 패키지(typescript,lint 등)npm install
를 진행할 때 추가—production
옵션을 통해 dependencies
에 기재된 가방만 설치하기 때문에 옵션을 지정하여 Production dependncies만 설치하여 최종 용기 이미지를 경감시킵니다.3. 실행 환경에서 가벼운 이미지 사용하기
용기의 이미지를 조금이나마 덜어주기 위해 가볍고 가벼운 이미지를 사용하세요.
샘플은
node:14.16.1-alpine
distroless 같은 것을 사용하는 것이 비교적 이상적이다.4. ** .dockerignore 파일을 올바르게 설정합니다.
창고에 dockerimage를 생성하는 데 필요하지 않은 파일이 몇 개 있습니다.
.dockerignore
필요하지 않은 파일을 정의하고 제외합니다.build에서 생성된
node_modules
와 dist
파일 등도 미리 정의해야 한다.**/node_modules/
**/.git
**/dist/
5. 루트 사용자에서 시작 중지
루트 사용자가 실행하는 경우 안전에 있어서 예상치 못한 고장과 취약성을 일으킬 수 있으므로 정의
USER
는 이 사용자가 수행하도록 하겠습니다.USER node
6.npm 명령node.일어설 수 없다
대부분의 프레임워크가 기본적으로 시작 명령
npm start
을 설정했다고 생각합니다.그러나 npm 명령은 신호를 Node로 바꿉니다.js
Graceful 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?그렇다면 토크가 있다면 꼭 댓글을 달아주세요.
Reference
이 문제에 관하여(Node.js Docker file 만들기 모범 사례), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kouchanne/articles/6485193823ecec5735d4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)