도커가 도커 파일을 빌드할 때 실행 npm 설치 명령을 캐시하는 방법
현재 애플리케이션용 노드 백엔드를 개발 중입니다.도커라이징 시 (docker build .
) 가장 긴 단계는RUN npm install
.그RUN npm install
명령어는 모든 작은 서버 코드 변경에서 실행되며, 이는 빌드 시간 증가로 인해 생산성을 저해합니다.
응용 프로그램 코드가 있는 곳에서 npm install을 실행하고 ADD 명령으로 node_modules를 컨테이너에 추가하면 이 문제가 해결되지만 모범 사례와는 거리가 멀다는 것을 알게 되었습니다.그것은 그것을 도커화하는 것에 대한 모든 생각을 깨뜨리고 용기의 무게를 훨씬 더 증가시킵니다.
다른 해결책은?
좋아요. 도커 파일을 작성할 때 효율성에 대한 이 훌륭한 기사를 발견했습니다.
다음은 잘못된 도커 파일이 실행되기 전에 응용 프로그램 코드를 추가하는 예입니다.RUN npm install
지침:
FROM ubuntu
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs
WORKDIR /opt/app
COPY . /opt/app
RUN npm install
EXPOSE 3001
CMD ["node", "server.js"]
응용프로그램 복사본을 두 개의 복사 지침(패키지용 하나)으로 나눕니다.json 파일 및 나머지 파일에 대한 json 파일)과 실제 코드를 추가하기 전에 npm 설치 명령을 실행하면 코드 변경이 발생하지 않고 패키지의 변경 사항만 실행됩니다.json이 그것을 촉발할 것입니다.Best Practice 도커 파일:
FROM ubuntu
MAINTAINER David Weinstein <david@bitjudo.com>
# install our dependencies and nodejs
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
# From here we load our application's code in, therefore the previous docker
# "layer" thats been cached will be used if possible
WORKDIR /opt/app
COPY . /opt/app
EXPOSE 3000
CMD ["node", "server.js"]
여기가 소포가 있는 곳입니다.json 파일이 추가되었습니다. 종속성을 설치하고 WORKDIR 컨테이너에 복사합니다. WORKDIR 컨테이너에는 앱이 있습니다.
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
모든 도커 빌드에서 npm 설치 단계를 피하려면 해당 행을 복사하고 ^/opt/app^을 컨테이너 내에 있는 앱 위치로 변경합니다.
이상해요! 다단계 빌드는 아무도 언급하지 않아요.
# ---- Base Node ----
FROM alpine:3.5 AS base
# install node
RUN apk add --no-cache nodejs-current tini
# set working directory
WORKDIR /root/chat
# Set tini as entrypoint
ENTRYPOINT ["/sbin/tini", "--"]
# copy project file
COPY package.json .
#
# ---- Dependencies ----
FROM base AS dependencies
# install node packages
RUN npm set progress=false && npm config set depth 0
RUN npm install --only=production
# copy production node_modules aside
RUN cp -R node_modules prod_node_modules
# install ALL node_modules, including 'devDependencies'
RUN npm install
#
# ---- Test ----
# run linters, setup and tests
FROM dependencies AS test
COPY . .
RUN npm run lint && npm run setup && npm run test
#
# ---- Release ----
FROM base AS release
# copy production node_modules
COPY --from=dependencies /root/chat/prod_node_modules ./node_modules
# copy app sources
COPY . .
# expose port and define CMD
EXPOSE 5000
CMD npm run start
여기 멋진 튜토: https://codefresh.io/docker-tutorial/node_docker_multistage/
가장 간단한 방법은 Docker의 복사 의미론을 활용하는 것입니다.
복사 명령은 에서 새 파일 또는 디렉터리를 복사하여 경로에 있는 컨테이너의 파일 시스템에 추가합니다.
이것은 만약 당신이 먼저 명시적으로 복사한다면,package.json
파일을 저장한 다음npm install
캐시된 후 원본 디렉터리의 나머지 부분을 복사할 수 있습니다.만약에package.json
파일이 변경되면 새 파일이 되고 이후 빌드를 위해 npm 설치 캐시를 다시 실행합니다.
Docker 파일의 끝 부분은 다음과 같습니다.
# install node modules
WORKDIR /usr/app
COPY package.json /usr/app/package.json
RUN npm install
# install application
COPY . /usr/app
이미 알고 계시겠지만, .dockerignore 파일을 다음을 포함하는 동일한 폴더에 포함할 수 있습니다.
node_modules
npm-debug.log
도커 허브에 푸시할 때 이미지가 부풀어 오르는 것을 방지하기 위해
당신은 tmp 폴더를 사용할 필요 없이 패키지를 복사하기만 하면 됩니다.json을 컨테이너의 응용프로그램 폴더에 설치하고 나중에 모든 파일을 복사합니다.
COPY app/package.json /opt/app/package.json
RUN cd /opt/app && npm install
COPY app /opt/app
복사가 아닌 볼륨을 사용하고 도커 합성을 계속 사용하고 싶었고 마지막에 명령 체인을 연결하여 수행할 수 있었습니다.
FROM debian:latest
RUN apt -y update \
&& apt -y install curl \
&& curl -sL https://deb.nodesource.com/setup_12.x | bash - \
&& apt -y install nodejs
RUN apt -y update \
&& apt -y install wget \
build-essential \
net-tools
RUN npm install pm2 -g
RUN mkdir -p /home/services_monitor/ && touch /home/services_monitor/
RUN chown -R root:root /home/services_monitor/
WORKDIR /home/services_monitor/
CMD npm install \
&& pm2-runtime /home/services_monitor/start.json
언급URL : https://stackoverflow.com/questions/35774714/how-to-cache-the-run-npm-install-instruction-when-docker-build-a-dockerfile
'programing' 카테고리의 다른 글
Spring 응용 프로그램의 유틸리티 클래스 - 정적 방법을 사용해야 합니까? (0) | 2023.07.26 |
---|---|
봄에 현재 HttpServletRequest를 가져오는 정적인 방법이 있습니까? (0) | 2023.07.26 |
jQuery '.is(":visible")'가 Chrome에서 작동하지 않음 (0) | 2023.07.26 |
중간 복사본 없이 표준 C에서 memmove를 구현하는 방법은 무엇입니까? (0) | 2023.07.26 |
Hibernate + Java에서는 성능이 느리지만 동일한 기본 Oracle 쿼리와 함께 TOD를 사용하면 성능이 빠름 (0) | 2023.07.26 |