Làm thế nào để Docker xây dựng lại một hình ảnh mà không cần bộ nhớ cache của nó

[ad_1]

Sửa máy tính tại nhà TPHCM

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:latesttrừ 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--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--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.

dịch vụ cài win online từ xa

[ad_2]

Vui lòng đánh giá về dịch vụ tại nhà