Dalam contoh pertama Anda, Anda memberikan -c
tandai ke docker exec
. Itu jawaban yang mudah:docker exec
tidak memiliki -c
bendera.
Dalam contoh kedua Anda, shell Anda mem-parsing ini menjadi dua perintah bahkan sebelum Docker melihatnya. Ini setara dengan ini:
if docker exec [id] cd /var/www/project
then
composer install
fi
Pertama, docker exec
dijalankan, dan jika keluar 0 (berhasil), composer install
akan mencoba menjalankan secara lokal , di luar Docker.
Yang perlu Anda lakukan adalah meneruskan kedua perintah sebagai satu argumen ke docker exec
menggunakan string. Maka mereka tidak akan ditafsirkan oleh shell sampai sudah berada di dalam container.
docker exec [id] "cd /var/www/project && composer install"
Namun, seperti yang Anda catat di komentar, ini juga tidak berfungsi. Itu karena cd
adalah shell bawaan, dan tidak ada dengan sendirinya. Mencoba menjalankannya sebagai perintah awal akan gagal. Jadi langkah selanjutnya adalah menyerahkan ini ke shell untuk dieksekusi.
docker exec [id] "bash -c 'cd /var/www/project && composer install'"
Dan terakhir, pada titik ini &&
telah pindah ke kumpulan tanda kutip bagian dalam, jadi kita tidak benar-benar membutuhkan tanda kutip di sekitar bash
perintah... Anda dapat menghapusnya jika mau.
docker exec [id] bash -c 'cd /var/www/project && composer install'
Semuanya setelah container id adalah perintah untuk dijalankan, jadi pada contoh pertama -c
bukan opsi untuk dieksekusi, tetapi docker perintah mencoba menjalankan dan gagal karena perintah itu tidak ada.
Kemungkinan besar Anda menemukan sintaks ini dari docker run
perintah di mana entrypoint diatur ke /bin/sh
. Namun, exec melewati titik masuk, jadi Anda harus menyertakan perintah lengkap untuk menjalankannya. Seperti yang telah ditunjukkan orang lain, perintah itu menyertakan bash seperti shell atau dalam contoh di bawah, sh:
docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'