Ok vì vậy tôi đã tìm thấy bài viết tuyệt vời này về hiệu quả khi viết tệp docker.
Đây là một ví dụ về một tệp docker không hợp lệ thêm mã ứng dụng trước khi chạy RUN npm install
hướng dẫn:
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"]
Bằng cách chia bản sao của ứng dụng thành 2 hướng dẫn SAO CHÉP (một cho tệp package.json và một cho các tệp còn lại) và chạy hướng dẫn cài đặt npm trước khi thêm mã thực, bất kỳ thay đổi mã nào sẽ không kích hoạt cài đặt npm RUN hướng dẫn, chỉ những thay đổi của package.json mới kích hoạt nó. Tệp docker thực hành tốt hơn:
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"]
Đây là nơi tệp package.json được thêm vào, cài đặt các phụ thuộc của nó và sao chép chúng vào vùng chứa WORKDIR, nơi ứng dụng hoạt động:
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
Để tránh giai đoạn cài đặt npm trên mọi bản dựng docker, chỉ cần sao chép các dòng đó và thay đổi ^ / opt / app ^ thành vị trí ứng dụng của bạn nằm bên trong vùng chứa.
ADD
không khuyến khích ủng hộCOPY
, afaik.COPY
thậm chí còn hiệu quả hơn. IMO, hai đoạn cuối là không cần thiết, vì chúng là bản sao và cũng từ quan điểm ứng dụng, nó không quan trọng ở vị trí nào trên hệ thống tệp mà ứng dụng tồn tại, miễn làWORKDIR
được đặt.