[ad_1]
Docker lưu trữ các kết quả xây dựng hình ảnh để tăng tốc các lần xây dựng lại tiếp theo. Mặc dù cơ chế này nói chung là đáng tin cậy, nhưng đôi khi bạn sẽ muốn tạo lại hình ảnh mà không cần sử dụng bộ nhớ cache. Điều này có thể là để chẩn đoán sự cố hoặc kiểm tra quy trình xây dựng hoàn chỉnh sẽ có thể tái tạo trong môi trường sạch sẽ.
Trong bài viết này, bạn sẽ tìm hiểu cách đạt được bản dựng mới mà không cần xóa bộ nhớ cache theo cách thủ công. Bạn cũng sẽ thấy cách kéo các hình ảnh cơ sở được cập nhật để bản dựng của bạn khớp với đầu ra mà bản cài đặt Docker mới sẽ tạo ra.
Cách hoạt động của bộ nhớ cache
Đây là một Dockerfile đơn giản:
FROM alpine:latest COPY 1.txt /1.txt COPY 2.txt /2.txt
Điền các tệp mẫu vào thư mục làm việc của bạn và xây dựng hình ảnh:
$ echo 1 > 1.txt $ echo 2 > 2.txt $ docker build -t demo:latest .
Đầu ra sẽ giống như sau:
Sending build context to Docker daemon 5.12kB Step 1/3 : FROM alpine:latest ---> 9c6f07244728 Step 2/3 : COPY 1.txt /1.txt ---> db61ff73c0b5 Step 3/3 : COPY 2.txt /2.txt ---> f1129e47fc12 Successfully built f1129e47fc12 Successfully tagged demo:latest
Bây giờ sửa đổi 2.txt
và sau đó xây dựng lại hình ảnh:
$ echo two > 2.txt $ docker build -t demo:latest . Sending build context to Docker daemon 5.12kB Step 1/3 : FROM alpine:latest ---> 9c6f07244728 Step 2/3 : COPY 1.txt /1.txt ---> Using cache ---> db61ff73c0b5 Step 3/3 : COPY 2.txt /2.txt ---> 75ba7d786049 Successfully built 75ba7d786049 Successfully tagged demo:latest
Giai đoạn xây dựng thứ hai cho thấy Using cache
bởi vì nội dung của 1.txt
không thay đổi. Lớp trung gian với ID db61ff73c0b5
được sử dụng lại cho bản dựng mới.
Tắt bộ nhớ cache
Bạn có thể vô hiệu hóa việc sử dụng bộ đệm ẩn lớp trung gian bằng cách bao gồm --no-cache
gắn cờ khi bạn chạy docker build
:
$ echo second > 2.txt $ docker build --no-cache -t demo:latest . Sending build context to Docker daemon 5.12kB Step 1/3 : FROM alpine:latest ---> 9c6f07244728 Step 2/3 : COPY 1.txt /1.txt ---> 1590b2407dd4 Step 3/3 : COPY 2.txt /2.txt ---> afb31630ce32 Successfully built afb31630ce32 Successfully tagged demo:latest
Lần này là một lớp hình ảnh mới, ID 1590b2407dd4
đã được tạo bởi giai đoạn xây dựng thứ hai, mặc dù 1.txt
vẫn chưa được sửa đổi.
Bạn có thể dùng --no-cache
cờ để buộc xây dựng lại khi bạn nghi ngờ bộ nhớ cache đã cũ hoặc bạn muốn bắt đầu lại từ đầu. Hiệu suất xây dựng sẽ bị giảm vì Docker sẽ cần phải tạo lại mọi lớp.
Kéo hình ảnh cơ sở cập nhật
Một dạng khác của bộ nhớ đệm liên quan đến các hình ảnh cơ sở mà Dockerfile của bạn tham chiếu trong FROM
hướng dẫn. Hình ảnh ví dụ trên sử dụng alpine:latest
làm cơ sở của nó. Docker sẽ không tự động lấy phiên bản cập nhật của alpine:latest
trừ khi hình ảnh chưa tồn tại trên máy chủ của bạn.
Điều này có nghĩa là bản dựng đầu tiên của Dockerfile sẽ kéo xuống các hình ảnh cơ sở bạn cần, miễn là bạn chưa có chúng. Các bản dựng lại sau đó sẽ không làm mới hình ảnh, vì vậy bạn có thể đang xây dựng trên một cơ sở lỗi thời. Việc xây dựng hình ảnh trên một máy chủ Docker khác có thể không tạo ra cùng một đầu ra nếu máy chủ đó kéo phiên bản mới hơn của cơ sở.
Bạn có thể buộc Docker kiểm tra các hình ảnh cơ sở được cập nhật tại thời điểm xây dựng bằng cách thêm --pull
gắn cờ cho bạn docker build
yêu cầu. Cái này tách biệt với --no-cache
. Sử dụng --pull
sẽ truy xuất tệp kê khai của thẻ hình ảnh từ sổ đăng ký của nó và so sánh nó với phiên bản trên máy của bạn. Hình ảnh mới sẽ được lấy từ sổ đăng ký khi có sự khác biệt trong các tệp kê khai.
$ docker build --no-cache --pull -t demo:latest . Sending build context to Docker daemon 5.12kB Step 1/3 : FROM alpine:latest latest: Pulling from library/alpine Digest: sha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad Status: Image is up to date for alpine:latest ---> 9c6f07244728 Step 2/3 : COPY 1.txt /1.txt ---> 4fee970dfaab Step 3/3 : COPY 2.txt /2.txt ---> 60d2e3fff0fb Successfully built 60d2e3fff0fb Successfully tagged demo:latest
Ví dụ trên cho thấy đầu ra bản dựng thay đổi như thế nào khi --pull
cờ được sử dụng. Docker cố gắng kéo hình ảnh cơ sở Alpine, mặc dù nó đã có trên máy từ các bản dựng ví dụ trước đó. Thông báo hình ảnh (SHA) được in tới thiết bị đầu cuối. Trong trường hợp này, thông báo không thay đổi so với phiên bản cục bộ nên Docker báo cáo rằng hình ảnh đã được cập nhật.
Các --no-cache
và --pull
cờ có thể được sử dụng độc lập hoặc kết hợp. Việc thêm chúng vào cả hai sẽ cung cấp cho bạn phương tiện chặn rõ ràng nhất để bắt đầu xây dựng của bạn, buộc Docker phải kiểm tra các hình ảnh cơ sở được cập nhật và bỏ qua bất kỳ lớp nào đã tạo trước đó. Nó tương đương với việc chạy bản dựng trên máy chủ Docker mới được cài đặt.
Sử dụng Docker Compose
Docker Compose hỗ trợ cả --no-cache
và --pull
cờ quá. Chúng có tác dụng tương tự như docker build
đối tác.
# Compose v2 $ docker compose build --no-cache --pull # Compose v1 $ docker-compose build --no-cache --pull
Làm sạch bộ nhớ cache bản dựng
Bạn có thể làm sạch bộ đệm ẩn của bản dựng để đảm bảo rằng nó không được sử dụng. Điều này cũng giúp giải phóng dung lượng ổ đĩa thừa bị tiêu thụ bởi các lớp xây dựng được lưu trong bộ nhớ cache.
Chạy docker builder prune
lệnh để làm trống bộ nhớ cache của bạn. Nó chỉ hoạt động khi bạn đang xây dựng hình ảnh bằng công cụ xây dựng BuildKit hiện đại.
$ docker builder prune
Chạy lệnh mà không có đối số chỉ xóa bộ đệm ẩn bản dựng đang treo. Điều này liên quan đến bộ nhớ đệm liên quan đến hình ảnh không còn xuất hiện trên máy chủ của bạn. Thêm -a
cờ để làm trống hoàn toàn bộ nhớ cache, bao gồm các lớp được sử dụng bởi hình ảnh:
$ docker builder prune -a
Cắt tỉa cũng chấp nhận một --filter
cờ có thể được sử dụng để nhắm mục tiêu các bộ nhớ đệm được sửa đổi trước hoặc kể từ một khoảng thời gian cụ thể.
# Delete caches modified in the past two hours $ docker build prune --filter since=2h # Delete caches modified more than two hours ago $ docker build prune --filter until=2h
Bản tóm tắt
Bộ đệm ẩn bản dựng Docker cải thiện hiệu suất bằng cách sử dụng lại các lớp hình ảnh trung gian giữa các bản dựng. Điều này tránh lãng phí công việc tạo lại các lớp đã tồn tại và không thay đổi. Mặc dù bộ đệm bản dựng thường được mong muốn, nhưng có những trường hợp bạn có thể muốn chạy bản dựng mà không có nó. Thêm --no-cache
gắn cờ cho các bản dựng của bạn cung cấp góc nhìn chính xác về những gì bản dựng sẽ tạo ra khi chạy trên một máy chủ mới.
Hình ảnh cơ sở cũ cũng cần được xem xét cùng với bộ nhớ cache bản dựng. Docker sử dụng lại các phiên bản cục bộ của hình ảnh cơ sở theo mặc định, điều này có thể khiến bạn tạo hình ảnh mới trên cơ sở lỗi thời. Sử dụng --pull
cờ buộc Docker kiểm tra các hình ảnh cơ sở được cập nhật trước khi bắt đầu xây dựng, giúp bạn có tính nhất quán cao hơn trên các môi trường khác nhau.
[ad_2]