Các mảng cú pháp CMD
(và RUN
và ENTRYPOINT
) vượt qua những lập luận cho hạt nhân trực tiếp như executive syscall. Không có tách của các lệnh từ những lập luận của không gian tẩu thoát của trích dẫn, IO chuyển hướng, biến thay thế đường ống giữa lệnh, chạy nhiều lệnh, ... trong sự của syscall. Các syscall chỉ mất thực thi để chạy và danh sách các lập luận để vượt qua mà thực thi, và nó chạy nó.
Giống như nhân vật $
để mở rộng biến, ;
để tách lệnh,
(không gian) để riêng, lập luận, &&
và ||
để chuỗi các lệnh, >
cho ra hướng, |
để ống giữa các lệnh ... đang tất cả các chức năng của vỏ và cần một cái gì đó như thế /bin/sh
hay /bin/bash
để giải thích, và thực hiện chúng.
Nếu bạn chuyển chuỗi cú pháp CMD
docker sẽ chạy lệnh của bạn với một vỏ:
CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm
Nếu không, thứ hai của bạn cú pháp làm chính xác điều tương tự:
CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]
Lưu ý rằng tôi khuyên bạn không nên chạy nhiều lệnh cách này bên trong một container vì không có xử lý lỗi nếu lần đầu chỉ huy không, đặc biệt là nếu nó chạy trong nền. Bạn cũng để lại một vỏ chạy như giám sát 1 bên trong thùng đó sẽ phá vỡ tín hiệu xử, kết quả là một sự chậm trễ 10 giây và không có vẻ yêu kiều giết container của bạn của docker. Tín hiệu có thể xử lý được giảm nhẹ bằng cách sử dụng các vỏ exec
lệnh:
CMD /etc/init.d/nullmailer start ; exec /usr/sbin/php5-fpm
Tuy nhiên, xử lý quá trình âm thầm thất bại trong nền yêu cầu chuyển sang một dạng của đa-quá trình quản lý, giống như supervisord, hoặc tốt hơn là chia tay của bạn ứng dụng vào nhiều hộp và triển khai với một cái gì đó như docker-soạn.