Sintaks json dari CMD
(dan RUN
dan ENTRYPOINT
) meneruskan argumen ke kernel secara langsung sebagai syscall exec. Tidak ada pemisahan perintah dari argumen dengan spasi, melarikan diri dari kutipan, pengalihan IO, substitusi variabel, perpipaan antara perintah, menjalankan beberapa perintah, dll, dalam syscall exec. Syscall hanya membutuhkan executable untuk dijalankan dan daftar argumen untuk diteruskan ke executable itu, dan menjalankannya.
Karakter suka $
memperluas variabel, ;
untuk memisahkan perintah,
(spasi) untuk memisahkan argumen, &&
dan ||
untuk rantai perintah, >
untuk pengalihan output, |
untuk menyalurkan antar perintah, dll, semua fitur dari shell dan memerlukan sesuatu seperti /bin/sh
atau /bin/bash
untuk menafsirkan dan mengimplementasikannya.
Jika Anda beralih ke sintaks string CMD
, buruh pelabuhan akan menjalankan perintah Anda dengan sebuah shell:
CMD /etc/init.d/nullmailer start ; /usr/sbin/php5-fpm
Jika tidak, sintaks kedua Anda melakukan hal yang persis sama:
CMD ["sh", "-c", "/etc/init.d/nullmailer start ; /usr/sbin/php5-fpm"]
Perhatikan bahwa saya tidak merekomendasikan menjalankan banyak perintah dengan cara ini di dalam sebuah wadah karena tidak ada kesalahan penanganan jika perintah pertama Anda gagal, terutama jika itu berjalan di latar belakang. Anda juga membiarkan cangkang berjalan sebagai pid 1 di dalam wadah yang akan merusak penanganan sinyal, menghasilkan penundaan 10 detik dan pembunuhan yang tidak berterima terhadap kontainer oleh buruh pelabuhan. Penanganan sinyal dapat dikurangi dengan menggunakan exec
perintah shell :
CMD /etc/init.d/nullmailer start ; exec /usr/sbin/php5-fpm
Namun, proses penanganan gagal secara diam-diam di latar belakang mengharuskan Anda beralih ke beberapa jenis manajer multi-proses seperti pengawas, atau lebih baik memecah aplikasi Anda menjadi beberapa wadah dan menyebarkannya dengan sesuatu seperti komposisi buruh pelabuhan.
exec
formulir ini , karena ini adalah formulir yang disukai? Mengapa lebih disukai? Atau haruskah saya menggunakanshell
formulir yang lebih sederhana ?