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

CMD /usr/bin/httpd -DFOREGROUND
3, hướng dẫn
CMD /usr/bin/httpd -DFOREGROUND
4 hay cả hai?

Nguyên tắc chung

Nế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

CMD /usr/bin/httpd -DFOREGROUND
3 +
CMD /usr/bin/httpd -DFOREGROUND
4 = đối số lệnh vùng chứa mặc định

Theo những điều sau đây

  1. Cả hai đều có thể ghi đè riêng trong thời gian chạy;
  2. Một trong hai hoặc cả hai có thể trống;
  3. Bằng phép cộng [+], chúng tôi muốn nói đến phép nối của
    CMD /usr/bin/httpd -DFOREGROUND
    3 và
    CMD /usr/bin/httpd -DFOREGROUND
    4, tương ứng, trong ngữ cảnh mảng

Một Lời Ngắn Gọn về Phòng

Để chứng minh lợi ích của

CMD /usr/bin/httpd -DFOREGROUND
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à
["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
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à
["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
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
["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
2, thì Chamber sẽ đặt biến môi trường
["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
3 thành giá trị an toàn trong vòng

Ví dụ đơn giản nhất

Hãy bắt đầu với một ví dụ. Đây là đoạn mã

["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
4 có cả
CMD /usr/bin/httpd -DFOREGROUND
3 và
CMD /usr/bin/httpd -DFOREGROUND
4, cả hai đều được chỉ định là mảng

CMD /usr/bin/httpd -DFOREGROUND
4

Đặt chúng lại với nhau, các đối số mặc định cho vùng chứa sẽ là

["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
7

Danh sách này gần đúng với lệnh shell

["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
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

["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
4,
CMD /usr/bin/httpd -DFOREGROUND
80 và
CMD /usr/bin/httpd -DFOREGROUND
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

CMD /usr/bin/httpd -DFOREGROUND
4 khởi động một web server như sau

CMD /usr/bin/httpd -DFOREGROUND

Docker sẽ tự động chuyển đổi

CMD /usr/bin/httpd -DFOREGROUND
4 thành một mảng trông như thế này

["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]

Điều này cũng đúng với

CMD /usr/bin/httpd -DFOREGROUND
3

Vì vậy, khi chúng tôi khai báo cả

CMD /usr/bin/httpd -DFOREGROUND
3 và
CMD /usr/bin/httpd -DFOREGROUND
4 và
CMD /usr/bin/httpd -DFOREGROUND
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
CMD /usr/bin/httpd -DFOREGROUND
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

CMD /usr/bin/httpd -DFOREGROUND
8

Danh sách đối số mặc định sẽ là

CMD /usr/bin/httpd -DFOREGROUND
89

Ghi chú.

CMD /usr/bin/httpd -DFOREGROUND
40 và
CMD /usr/bin/httpd -DFOREGROUND
41 không thể cùng là giá trị chuỗi. Cả hai đều có thể là giá trị mảng và
CMD /usr/bin/httpd -DFOREGROUND
3 có thể là giá trị mảng và
CMD /usr/bin/httpd -DFOREGROUND
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 định

Chỉ định

CMD /usr/bin/httpd -DFOREGROUND
4 trong một
["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
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
CMD /usr/bin/httpd -DFOREGROUND
48, chúng sẽ ghi đè giá trị của
CMD /usr/bin/httpd -DFOREGROUND
4

Để minh họa, giả sử chúng ta có

["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
4 sau và tạo một hình ảnh từ nó có tên là
CMD /usr/bin/httpd -DFOREGROUND
21

CMD /usr/bin/httpd -DFOREGROUND
4

Nếu chúng ta gọi

CMD /usr/bin/httpd -DFOREGROUND
22, vùng chứa sẽ được tạo với các đối số sau

CMD /usr/bin/httpd -DFOREGROUND
2

Thay vào đó, nếu chúng ta gọi

CMD /usr/bin/httpd -DFOREGROUND
23, thì vùng chứa sẽ được tạo bằng các đối số này

CMD /usr/bin/httpd -DFOREGROUND
7

Lưu ý rằng

CMD /usr/bin/httpd -DFOREGROUND
4 được thay thế hoàn toàn — nó không được thêm vào trước hoặc thêm vào

ENTRYPOINT cũng có thể ghi đè

Chúng tôi cũng có thể dễ dàng ghi đè lên

CMD /usr/bin/httpd -DFOREGROUND
3 được khai báo trong một
["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
4. Để làm như vậy, chúng tôi chỉ định đối số tùy chọn
CMD /usr/bin/httpd -DFOREGROUND
27 thành
CMD /usr/bin/httpd -DFOREGROUND
48

Giả sử, như trước đây, chúng ta có

["/bin/sh", "-c", "/usr/bin/httpd -DFOREGROUND"]
4 sau và tạo một hình ảnh từ nó có tên là
CMD /usr/bin/httpd -DFOREGROUND
21

CMD /usr/bin/httpd -DFOREGROUND
4

Bây giờ, hãy thay đổi

CMD /usr/bin/httpd -DFOREGROUND
3 bằng cách chạy như sau

CMD /usr/bin/httpd -DFOREGROUND
7

Theo quy tắc chung của chúng tôi, danh sách đối số sau đây sẽ được xây dựng

CMD /usr/bin/httpd -DFOREGROUND
8

Ghi đè cả ENTRYPOINT và CMD

Chúng ta có thể ghi đè cả

CMD /usr/bin/httpd -DFOREGROUND
3 và
CMD /usr/bin/httpd -DFOREGROUND
4 không?

CMD /usr/bin/httpd -DFOREGROUND
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

CMD /usr/bin/httpd -DFOREGROUND
1

Khi 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

CMD /usr/bin/httpd -DFOREGROUND
3 và
CMD /usr/bin/httpd -DFOREGROUND
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
CMD /usr/bin/httpd -DFOREGROUND
3 và khi nào nên sử dụng
CMD /usr/bin/httpd -DFOREGROUND
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à

CMD /usr/bin/httpd -DFOREGROUND
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 sau

Giấy gói

Mộ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

CMD /usr/bin/httpd -DFOREGROUND
40 ở cuối

Khai báo một

CMD /usr/bin/httpd -DFOREGROUND
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
CMD /usr/bin/httpd -DFOREGROUND
48

Hình ảnh đơn mục đích

Nế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

CMD /usr/bin/httpd -DFOREGROUND
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
CMD /usr/bin/httpd -DFOREGROUND
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.
CMD /usr/bin/httpd -DFOREGROUND
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ư
CMD /usr/bin/httpd -DFOREGROUND
46 – giống như bạn sẽ làm nếu bạn đang chạy nginx mà không có Docker

Hì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

CMD /usr/bin/httpd -DFOREGROUND
47 để chỉ định một động từ ánh xạ tới chế độ, chẳng hạn như
CMD /usr/bin/httpd -DFOREGROUND
48,
CMD /usr/bin/httpd -DFOREGROUND
49 hoặc
CMD /usr/bin/httpd -DFOREGROUND
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
CMD /usr/bin/httpd -DFOREGROUND
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ư

CMD /usr/bin/httpd -DFOREGROUND
2

Các đối số sẽ được chuyển đến điểm vào khi gọi thông qua

CMD /usr/bin/httpd -DFOREGROUND
72 hoặc
CMD /usr/bin/httpd -DFOREGROUND
73,
CMD /usr/bin/httpd -DFOREGROUND
74, v.v.

Phần kết luận

Docker 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 .

Chủ Đề