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 địnhTheo những điều sau đây
- Cả hai đều có thể ghi đè riêng trong thời gian chạy;
- Một trong hai hoặc cả hai có thể trống;
- Bằng phép cộng [+], chúng tôi muốn nói đến phép nối của
3 vàCMD /usr/bin/httpd -DFOREGROUND
4, tương ứng, trong ngữ cảnh mảngCMD /usr/bin/httpd -DFOREGROUND
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òngVí 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ảngCMD /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"]
7Danh 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ư sauCMD /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
3Vì 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
8Danh sách đối số mặc định sẽ là
CMD /usr/bin/httpd -DFOREGROUND
89Ghi 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
21CMD /usr/bin/httpd -DFOREGROUND
4Nế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ố sauCMD /usr/bin/httpd -DFOREGROUND
2Thay 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àyCMD /usr/bin/httpd -DFOREGROUND
7Lư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àoENTRYPOINT 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
48Giả 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
21CMD /usr/bin/httpd -DFOREGROUND
4Bây giờ, hãy thay đổi
CMD /usr/bin/httpd -DFOREGROUND
3 bằng cách chạy như sauCMD /usr/bin/httpd -DFOREGROUND
7Theo 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
8Ghi đè 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
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
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 sauGiấ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ốiKhai 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
48Hì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ó 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
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
2Cá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