Cách tăng tốc bản dựng Docker và tối ưu hóa bộ nhớ đệm với

[ad_1]

COPY --link là một tính năng BuildKit mới có thể tăng tốc đáng kể các bản dựng hình ảnh Docker của bạn. Nó hoạt động bằng cách sao chép các tệp vào các lớp hình ảnh độc lập mà không phụ thuộc vào sự hiện diện của các tệp tiền nhiệm. Bạn có thể thêm nội dung mới vào hình ảnh mà không có hình ảnh cơ sở thậm chí hiện có trên hệ thống của bạn.

Khả năng này đã được thêm vào như một phần của Buildx v0.8 vào tháng 3 năm 2022. Nó được bao gồm trong phiên bản 20.10.14 của Docker CLI, vì vậy bạn sẽ có quyền truy cập nếu đang chạy bản phát hành mới nhất.

Trong bài viết này, chúng tôi sẽ chỉ ra những gì --link hiện và giải thích nó hoạt động như thế nào. Chúng tôi cũng sẽ xem xét một số tình huống mà nó không nên được dùng.

--link là một đối số tùy chọn mới cho Dockerfile hiện có COPY hướng dẫn. Nó thay đổi cách thức hoạt động của các bản sao bằng cách tạo một lớp ảnh chụp nhanh mới mỗi khi bạn sử dụng nó.

Thường xuyên COPY câu lệnh thêm tệp vào lớp đứng trước chúng trong Dockerfile. Nội dung của lớp đó cần phải tồn tại trên đĩa của bạn để nội dung mới có thể được hợp nhất trong:

FROM alpine
COPY my-file /my-file
COPY another-file /another-file

Dockerfile ở trên các bản sao my-file vào lớp được tạo bởi lệnh trước đó. Sau FROM hướng dẫn, hình ảnh bao gồm nội dung của Alpine:

bin/
dev/
etc/
...

Người đầu tiên COPY hướng dẫn tạo ra một hình ảnh bao gồm mọi thứ từ Alpine, cũng như my-file tập tin:

my-file
bin/
dev/
etc/
...

Va thu hai COPY hướng dẫn thêm another-file trên đầu hình ảnh này:

another-file
my-file
bin/
dev/
etc/
...

Lớp được tạo ra bởi mỗi lệnh bao gồm mọi thứ có trước nó, cũng như mọi thứ mới được thêm vào. Vào cuối quá trình xây dựng, Docker sử dụng một quy trình khác nhau để tìm ra những thay đổi trong mỗi lớp. Khối hình ảnh cuối cùng chỉ chứa các tệp đã được thêm vào mỗi giai đoạn ảnh chụp nhanh nhưng điều này không được phản ánh trong quá trình lắp ráp trong quá trình xây dựng.

“–Link” sửa đổi COPY để tạo một hệ thống tệp độc lập mới mỗi khi nó được sử dụng. Thay vì sao chép các tệp mới trên lớp trước, chúng được gửi đến một vị trí hoàn toàn khác để trở thành một lớp độc lập. Các lớp sau đó được liên kết với nhau để tạo ra hình ảnh cuối cùng.

Hãy thay đổi Dockerfile mẫu để sử dụng --link:

FROM alpine
COPY --link my-file /my-file
COPY --link another-file /another-file

Kết quả của FROM hướng dẫn không thay đổi – nó tạo ra lớp Alpine, với tất cả nội dung của hình ảnh đó:

bin/
dev/
etc/
...

Người đầu tiên COPY hướng dẫn có một hiệu ứng đáng chú ý khác nhau. Lần này, một lớp độc lập khác được tạo ra. Đó là một hệ thống tệp mới chỉ chứa my-file:

my-file

Sau đó, thứ hai COPY hướng dẫn tạo một ảnh chụp nhanh mới khác chỉ với another-file:

another-file

Khi quá trình xây dựng hoàn tất, Docker lưu trữ các ảnh chụp nhanh độc lập này dưới dạng lưu trữ lớp mới (tarball). Các tarball được liên kết trở lại chuỗi các lớp trước đó, tạo nên hình ảnh cuối cùng. Điều này bao gồm tất cả ba ảnh chụp nhanh được hợp nhất với nhau, dẫn đến một hệ thống tệp phù hợp với hệ thống ban đầu khi vùng chứa được tạo:

my-file
another-file
bin/
dev/
etc/
...

Hình ảnh này từ dự án BuildKit minh họa sự khác biệt giữa hai cách tiếp cận.

Hình ảnh từ blog Docker cho thấy sự khác biệt giữa "SAO CHÉP" và "Sao chép đường dẫn"

COPY --link chỉ khả dụng khi bạn đang sử dụng BuildKit để xây dựng hình ảnh của mình. Chạy bản dựng của bạn với docker buildx --create hoặc dùng docker build với DOCKER_BUILDKIT=1 bộ biến môi trường.

Bạn cũng phải chọn tham gia cú pháp Dockerfile v1.4 bằng cách sử dụng nhận xét ở đầu tệp của bạn:

# syntax=docker/dockerfile:1.4
FROM alpine:latest
COPY --link my-file /my-file
COPY --link another-file /another-file

Giờ đây, bạn có thể xây dựng hình ảnh của mình với sự hỗ trợ cho các bản sao được liên kết:

DOCKER_BUILDKIT=1 docker build -t my-image:latest .

Hình ảnh được xây dựng từ Dockerfiles bằng cách sử dụng COPY --link có thể được sử dụng như bất kỳ khác. Bạn có thể bắt đầu một vùng chứa với docker run và đẩy họ thẳng đến cơ quan đăng ký. Các --link cờ chỉ ảnh hưởng đến cách nội dung được thêm vào các lớp hình ảnh trong quá trình xây dựng.

Tại sao các bản sao được liên kết lại quan trọng

Sử dụng --link cờ cho phép các bộ nhớ đệm xây dựng được sử dụng lại ngay cả khi nội dung bạn COPY trong những thay đổi. Ngoài ra, các bản dựng có thể hoàn thành mà không cần hình ảnh cơ sở của chúng thậm chí còn tồn tại trên máy của bạn.

Quay lại ví dụ ở trên, tiêu chuẩn COPY hành vi yêu cầu alpine hình ảnh tồn tại trên máy chủ Docker của bạn trước khi có thể thêm nội dung mới. Hình ảnh sẽ được tải xuống tự động trong quá trình xây dựng nếu bạn chưa kéo nó trước đó.

Với các bản sao được liên kết, Docker không cần alpine nội dung của hình ảnh. Nó kéo alpine tệp kê khai, tạo các lớp độc lập mới cho các tệp đã sao chép, sau đó tạo tệp kê khai đã sửa đổi liên kết các lớp với các lớp được cung cấp bởi alpine. Nội dung của alpine hình ảnh – các đốm màu của nó – sẽ chỉ được tải xuống nếu bạn bắt đầu một vùng chứa từ hình ảnh mới của mình hoặc xuất nó sang một kho lưu trữ tar. Khi bạn đẩy hình ảnh vào sổ đăng ký, sổ đăng ký đó sẽ lưu trữ các lớp mới của nó và lấy từ xa alpine những cái.

Chức năng này cũng tạo điều kiện cho việc giảm giá hình ảnh hiệu quả. Có lẽ bạn hiện đang phân phối hình ảnh Docker bằng bản phát hành Ubuntu 20.04 LTS mới nhất:

FROM golang AS build
...
RUN go build -o /app .

FROM ubuntu:20.04
COPY --link --from=build /app /bin/app
ENTRYPOINT ["/bin/app"]

Bạn có thể xây dựng hình ảnh với bộ nhớ đệm được bật bằng BuildKit’s --cache-to lá cờ. Các inline lưu trữ bộ nhớ cache xây dựng dữ liệu bộ nhớ cache bên trong hình ảnh đầu ra, nơi nó có thể được sử dụng lại trong các bản dựng tiếp theo:

docker buildx build --cache-to type=inline -t example-image:20.04 .

Bây giờ, giả sử bạn muốn cung cấp một hình ảnh dựa trên LTS tiếp theo sau khi phát hành, Ubuntu 22.04:

FROM golang AS build
...
RUN go build -o /app .

FROM ubuntu:22.04
COPY --link --from=build /app /bin/app
ENTRYPOINT ["/bin/app"]

Tạo lại hình ảnh bằng cách sử dụng dữ liệu bộ nhớ cache được nhúng trong phiên bản gốc:

docker buildx build --cache-from example-image:20.04 -t example-image:22.04 .

Việc xây dựng sẽ hoàn thành gần như ngay lập tức. Sử dụng dữ liệu đã lưu trong bộ nhớ cache từ hình ảnh hiện có, Docker có thể xác minh các tệp cần thiết để tạo /app không thay đổi. Điều này có nghĩa là bộ nhớ cache cho lớp độc lập được tạo bởi COPY hướng dẫn vẫn còn hiệu lực. Vì lớp này không phụ thuộc vào bất kỳ lớp nào khác, ubuntu:22.04 hình ảnh cũng sẽ không được kéo. Docker chỉ liên kết lớp ảnh chụp nhanh chứa /bin/app vào một tệp kê khai mới trong ubuntu:22.04 chuỗi lớp. Lớp ảnh chụp nhanh được “phục hồi” một cách hiệu quả vào một hình ảnh mẹ mới mà không xảy ra bất kỳ hoạt động hệ thống tệp nào.

Mô hình cũng tối ưu hóa các bản dựng nhiều giai đoạn trong đó các thay đổi có thể xảy ra giữa bất kỳ giai đoạn nào:

FROM golang AS build
RUN go build -o /app .

FROM config-builder AS config
RUN generate-config --out /config.yaml

FROM ubuntu:latest
COPY --link --from=config /config.yaml build.conf
COPY --link --from=build /app /bin/app

Không có --linkbất kỳ thay đổi nào đối với config.yaml nguyên nhân ubuntu:latest để được kéo và tệp sẽ được sao chép vào. Sau đó, tệp nhị phân phải được biên dịch lại vì bộ đệm ẩn của nó bị vô hiệu bởi các thay đổi của hệ thống tệp. Với các bản sao được liên kết, thay đổi đối với config.yaml cho phép quá trình xây dựng tiếp tục mà không cần kéo ubuntu:latest hoặc biên dịch lại nhị phân. Lớp ảnh chụp nhanh với build.conf bên trong chỉ đơn giản là được thay thế bằng một phiên bản mới độc lập với tất cả các lớp khác.

Khi nào không sử dụng

Có một số tình huống mà --link cờ sẽ không hoạt động chính xác. Bởi vì nó sao chép các tệp vào một lớp mới, thay vì thêm chúng vào trên lớp trước đó, bạn không thể sử dụng các tham chiếu không rõ ràng làm đường dẫn đích của mình:

COPY --link my-file /data

Với một COPY hướng dẫn, my-file sẽ được sao chép vào /data/my-file nếu /data đã tồn tại dưới dạng một thư mục trong hình ảnh. Với --linkhệ thống tệp của lớp mục tiêu sẽ luôn trống, vì vậy my-file được viết cho /data.

Việc xem xét tương tự cũng áp dụng cho độ phân giải liên kết biểu tượng. Tiêu chuẩn COPY tự động giải quyết các đường dẫn đích là các liên kết tượng trưng trong hình ảnh. Khi bạn đang sử dụng --linkhành vi này không được hỗ trợ vì liên kết biểu tượng sẽ không tồn tại trong lớp độc lập của bản sao.

Bạn nên bắt đầu sử dụng --link bất cứ nơi nào những giới hạn này không áp dụng. Việc áp dụng tính năng này sẽ tăng tốc các bản dựng của bạn và làm cho bộ nhớ đệm mạnh mẽ hơn. Nếu bạn không thể xóa ngay lập tức các đường dẫn đích không rõ ràng hoặc được liên kết tượng trưng, ​​bạn có thể tiếp tục sử dụng COPY hướng dẫn. Đó là do những thay đổi không tương thích ngược này mà --link là cờ tùy chọn, thay vì cờ mặc định mới.

Bản tóm tắt

BuildKit’s COPY --link là một tính năng Dockerfile mới có thể giúp xây dựng nhanh hơn và hiệu quả hơn. Hình ảnh sử dụng các bản sao được liên kết không cần phải kéo các lớp trước đó chỉ để các tệp có thể được sao chép vào chúng. Docker tạo một lớp độc lập mới cho mỗi COPY thay vào đó, sau đó liên kết các lớp đó trở lại chuỗi.

Bạn có thể bắt đầu sử dụng các bản sao được liên kết ngay bây giờ nếu bạn đang xây dựng hình ảnh bằng BuildKit và phiên bản mới nhất của Buildx hoặc Docker CLI. Việc áp dụng “–link” là một bước xây dựng Docker thực tiễn tốt nhất mới, miễn là bạn không bị ảnh hưởng bởi những thay đổi đối với độ phân giải đường dẫn đích mà nó cần.



[ad_2]

Đánh giá dịch vụ post
Chat Zalo
0903064855