CMD có ghi đè điểm vào không?
Ví dụ – Khi bạn bắt đầu hành trình tạo bộ chứa Docker của mình, bạn có thể thấy mình phải đối mặt với một câu hỏi khó hiểu. Dockerfile của bạn nên chứa hướng dẫn 3, hướng dẫn 4 hay cả hai? Show
Nguyên tắc chungNếu có một bài học bạn nên rút ra ngày hôm nay, thì đó là quy tắc chung sau đây 3 + 4 = đối số lệnh vùng chứa mặc địnhTheo những điều sau đây
Một Lời Ngắn Gọn về PhòngĐể chứng minh lợi ích của 3, chúng tôi giới thiệu Chamber, một tiện ích mã nguồn mở cung cấp cho môi trường của bộ chứa các giá trị có trong Cửa hàng tham số của AWS Systems Manager. Một lệnh gọi điển hình là 0, lệnh này tìm nạp tất cả các giá trị Lưu trữ tham số có các khóa có tiền tố là 1, chuyển đổi các dấu gạch chéo trong các phím thành dấu gạch dưới và điền vào môi trường các khóa và giá trị được trả về. Ví dụ: nếu tìm thấy khóa 2, thì Chamber sẽ đặt biến môi trường 3 thành giá trị an toàn trong vòngVí dụ đơn giản nhấtHãy bắt đầu với một ví dụ. Đây là đoạn mã 4 có cả 3 và 4, cả hai đều được chỉ định là mảng 4Đặt chúng lại với nhau, các đối số mặc định cho vùng chứa sẽ là 7Danh sách này gần đúng với lệnh shell 8. (Trên thực tế, điều này liên quan đến những gì shell chủ yếu làm. họ lấy các "lệnh" được phân tách bằng dấu cách tại dấu nhắc và cuối cùng biến chúng thành các mảng đối số để chuyển đến lệnh gọi hệ thống exec. )Đối số luôn là mảngĐiều quan trọng là phải hiểu rằng, trong 4, 80 và 4 luôn được chuyển đổi thành mảng — ngay cả khi bạn khai báo chúng dưới dạng chuỗi. (Tuy nhiên, tôi luôn khuyên bạn nên khai báo chúng dưới dạng mảng để tránh sự mơ hồ. )Giả sử chúng ta khai báo một 4 khởi động một web server như sau
Docker sẽ tự động chuyển đổi 4 thành một mảng trông như thế này
Điều này cũng đúng với 3Vì vậy, khi chúng tôi khai báo cả 3 và 4 và 3 là một danh sách, cả hai được nối với nhau để tạo thành một danh sách đối số mặc định — ngay cả khi chúng tôi khai báo 4 là một chuỗiĐây là một ví dụ minh họa điểm. Nếu chúng ta khai báo như sau 8Danh sách đối số mặc định sẽ là 89Ghi chú. 40 và 41 không thể cùng là giá trị chuỗi. Cả hai đều có thể là giá trị mảng và 3 có thể là giá trị mảng và 4 có thể là giá trị chuỗi; . Đây là hậu quả đáng tiếc nhưng không thể tránh khỏi của cách chuyển đổi chuỗi đối số thành mảng. Đây là một trong những lý do tôi luôn khuyên bạn nên chỉ định mảng bất cứ khi nào có thểCMD chỉ là một mặc địnhChỉ định 4 trong một 4 chỉ tạo ra một giá trị mặc định. nếu chúng tôi chuyển các đối số không phải tùy chọn cho 48, chúng sẽ ghi đè giá trị của 4Để minh họa, giả sử chúng ta có 4 sau và tạo một hình ảnh từ nó có tên là 21 4Nếu chúng ta gọi 22, vùng chứa sẽ được tạo với các đối số sau 2Thay vào đó, nếu chúng ta gọi 23, thì vùng chứa sẽ được tạo bằng các đối số này 7Lưu ý rằng 4 được thay thế hoàn toàn — nó không được thêm vào trước hoặc thêm vàoENTRYPOINT cũng có thể ghi đèChúng tôi cũng có thể dễ dàng ghi đè lên 3 được khai báo trong một 4. Để làm như vậy, chúng tôi chỉ định đối số tùy chọn 27 thành 48Giả sử, như trước đây, chúng ta có 4 sau và tạo một hình ảnh từ nó có tên là 21 4Bây giờ, hãy thay đổi 3 bằng cách chạy như sau 7Theo quy tắc chung của chúng tôi, danh sách đối số sau đây sẽ được xây dựng 8Ghi đè cả ENTRYPOINT và CMDChúng ta có thể ghi đè cả 3 và 4 không? 0Đây là danh sách đối số tương ứng - đến thời điểm này sẽ không có gì ngạc nhiên 1Khi Nào Tôi Nên Sử Dụng ENTRYPOINT?Giả sử chúng ta đang xây dựng ________ 74 của riêng mình cho một dự án. Tại thời điểm này, chúng tôi hiểu cơ chế về cách 3 và 4 phối hợp với nhau để xây dựng danh sách đối số mặc định cho vùng chứa. Nhưng bây giờ chúng ta cần biết nên chọn cái nào. Khi nào nên sử dụng 3 và khi nào nên sử dụng 4?Lựa chọn bạn đưa ra phần lớn là một lựa chọn nghệ thuật và nó sẽ phụ thuộc đáng kể vào trường hợp sử dụng của bạn. Tuy nhiên, kinh nghiệm của tôi là 3 phù hợp với hầu hết mọi trường hợp tôi gặp phải. Xem xét các trường hợp sử dụng sauGiấy góiMột số hình ảnh chứa cái gọi là "trình bao bọc" để tô điểm cho một chương trình cũ hoặc nói cách khác là chuẩn bị cho chương trình đó để sử dụng trong môi trường được chứa. Ví dụ: giả sử dịch vụ của bạn được viết để đọc cấu hình của nó từ một tệp thay vì từ các biến môi trường. Trong tình huống như vậy, bạn có thể bao gồm tập lệnh bao bọc để tạo tệp cấu hình của ứng dụng từ các biến môi trường, sau đó khởi chạy ứng dụng bằng cách gọi 40 ở cuốiKhai báo một 3 trỏ đến trình bao bọc là một cách tuyệt vời để đảm bảo trình bao bọc luôn chạy, bất kể đối số nào được chuyển đến 48Hình ảnh đơn mục đíchNếu hình ảnh của bạn được xây dựng để chỉ thực hiện một việc — ví dụ: chạy máy chủ web — hãy sử dụng 3 để chỉ định đường dẫn đến máy chủ nhị phân và bất kỳ đối số bắt buộc nào. Một ví dụ trong sách giáo khoa về điều này là hình ảnh 44, với mục đích duy nhất là chạy máy chủ web nginx. Điều này cho thấy một lời gọi dòng lệnh dễ chịu và tự nhiên. 45. Sau đó, bạn có thể nối các đối số chương trình một cách tự nhiên trên dòng lệnh, chẳng hạn như 46 – giống như bạn sẽ làm nếu bạn đang chạy nginx mà không có DockerHình ảnh đa chế độNó cũng là một mẫu phổ biến cho các hình ảnh hỗ trợ nhiều “chế độ” sử dụng đối số đầu tiên cho 47 để chỉ định một động từ ánh xạ tới chế độ, chẳng hạn như 48, 49 hoặc 70. Đối với những trường hợp sử dụng như vậy, tôi khuyên bạn nên đặt 3 để trỏ đến tập lệnh phân tích đối số bằng lời nói và thực hiện đúng dựa trên giá trị của nó, chẳng hạn như 2Các đối số sẽ được chuyển đến điểm vào khi gọi thông qua 72 hoặc 73, 74, v.v.Phần kết luậnDocker có chức năng xây dựng hình ảnh cực kỳ mạnh mẽ và linh hoạt, và có thể khó quyết định chính xác cách xây dựng các đối số thời gian chạy mặc định của vùng chứa. Tôi hy vọng bài viết này cung cấp thông tin rõ ràng về cách hoạt động của cơ chế lắp ráp đối số và cách tận dụng chúng để đạt hiệu quả tốt nhất trong môi trường của bạn Chúng ta có thể sử dụng CMD và ENTRYPOINT cùng nhau không?Có nhiều tình huống trong đó việc kết hợp CMD và ENTRYPOINT sẽ là giải pháp tốt nhất cho bộ chứa Docker của bạn . Trong những trường hợp như vậy, tệp thực thi được xác định bằng ENTRYPOINT, trong khi CMD chỉ định tham số mặc định. Ghi chú. Nếu bạn đang sử dụng cả hai hướng dẫn, hãy đảm bảo giữ chúng ở dạng exec.
ENTRYPOINT có thể bị ghi đè không?Sự khác biệt chính giữa CMD và Entrypoint là bạn có thể ghi đè lệnh CMD từ Docker CLI khi vùng chứa đang chạy. Tuy nhiên, bạn không thể ghi đè lệnh điểm vào chỉ bằng các tham số dòng lệnh. Thay vào đó, bạn cần sử dụng lệnh docker run với một cú pháp cụ thể
Chúng tôi có thể ghi đè ENTRYPOINT trong Dockerfile không?Nếu bạn đang ghi đè Dockerfile ENTRYPOINT hoặc CMD , điều đó chỉ ảnh hưởng đến hình ảnh chứ không ảnh hưởng đến việc triển khai trong Kubernetes . Nếu triển khai sử dụng hình ảnh này xác định các tùy chọn lệnh hoặc đối số, chúng sẽ được ưu tiên hơn các phần ghi đè mà bạn xác định cho hình ảnh.
Chúng ta có thể ghi đè CMD trong Dockerfile không?Lệnh docker run có một số tùy chọn để thiết lập hoặc ghi đè hướng dẫn CMD và ENTRYPOINT của Dockerfile . |