programing

도커가 도커 파일을 빌드할 때 실행 npm 설치 명령을 캐시하는 방법

lastmoon 2023. 7. 26. 22:21
반응형

도커가 도커 파일을 빌드할 때 실행 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

반응형