그래서 도커 파일을 작성할 때 효율성에 관한 이 훌륭한 기사를 찾았습니다 .
다음은 RUN npm install
명령어 를 실행하기 전에 애플리케이션 코드를 추가하는 잘못된 Docker 파일의 예입니다 .
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"]
응용 프로그램의 사본을 2 개의 COPY 명령 (하나는 package.json 파일 용, 다른 하나는 나머지 파일 용)으로 나누고 실제 코드를 추가하기 전에 npm 설치 명령을 실행하면 코드 변경으로 인해 RUN npm 설치가 트리거되지 않습니다. 지시에 따라 package.json의 변경 만 트리거됩니다. 더 나은 연습 Docker 파일 :
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"]
여기서 package.json 파일이 추가되고 종속성을 설치하고 앱이있는 컨테이너 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 ^를 앱이 컨테이너 내부에있는 위치로 변경하십시오.
ADD
에 찬성하지 않습니다COPY
.COPY
훨씬 더 효과적입니다. IMO, 마지막 두 단락은 중복되기 때문에 필요하지 않으며 앱의 관점에서도 설정되어있는 한 파일 시스템에서 앱이 어디에 있는지는 중요하지 않습니다WORKDIR
.