Ok vì vậy tôi đã tìm thấy this great article về hiệu quả khi viết tệp docker.
Đây là một ví dụ về một tập tin Docker xấu 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 các bản sao của ứng dụng thành 2 hướng dẫn COPY (một cho các tập tin và package.json cái còn lại cho các tập tin còn lại) và chạy lệnh 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 lệnh cài đặt RUN npm, chỉ những thay đổi của package.json mới kích hoạt nó. Better tập thực hành Docker:
FROM ubuntu
MAINTAINER David Weinstein <[email protected]>
# 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 các tập tin package.json thêm, cài đặt phụ thuộc của nó và sao chép chúng vào workdir container, nơi ứng dụng số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 NPM cài đặt giai đoạn trên mỗi docker xây dựng chỉ cần sao chép những dòng và thay đổi ^/opt/app^đến vị trí ứng dụng của bạn sống bên trong container.
đó làm việc. Một số điểm mặc dù. 'ADD' không được khuyến khích cho' COPY', afaik. 'COPY' thậm chí còn hiệu quả hơn.IMO, hai đoạn cuối không cần thiết, vì chúng là bản sao và cũng từ quan điểm ứng dụng, không quan trọng ở đâu trên hệ thống tệp mà ứng dụng tồn tại, miễn là 'WORKDIR' được đặt. – eljefedelrodeodeljefe
Tốt hơn là kết hợp tất cả các lệnh apt-get vào một RUN, bao gồm một 'apt-get clean'. Ngoài ra, hãy thêm ./node_modules vào .dockerignore của bạn, để tránh sao chép thư mục làm việc của bạn vào vùng chứa đã được xây dựng của bạn và để tăng tốc bản sao xây dựng bối cảnh của bản dựng. – Symmetric
Vì lý do gì bạn thực hiện lệnh sao chép trong một RUN riêng biệt? Và có vấn đề gì nếu tôi di chuyển gói node_modules thay vì sao chép nó? Bởi vì nó có thể nhận được tương đối lớn tùy thuộc vào bao nhiêu bạn cài đặt –