En su primer ejemplo, está dando el -c
marca a docker exec
. Esa es una respuesta fácil:docker exec
no tiene un -c
bandera.
En su segundo ejemplo, su shell está analizando esto en dos comandos antes de que Docker lo vea. Es equivalente a esto:
if docker exec [id] cd /var/www/project
then
composer install
fi
Primero, el docker exec
se ejecuta, y si sale 0 (éxito), composer install
intentará ejecutar localmente , fuera de Docker.
Lo que debe hacer es pasar ambos comandos como un solo argumento a docker exec
usando una cuerda. Entonces no serán interpretados por un caparazón hasta que ya estén dentro del contenedor.
docker exec [id] "cd /var/www/project && composer install"
Sin embargo, como notó en los comentarios, esto tampoco funciona. Eso es porque cd
es un shell incorporado y no existe por sí solo. Intentar ejecutarlo como el comando inicial fallará. Entonces, el siguiente paso es entregar esto a un shell para que lo ejecute.
docker exec [id] "bash -c 'cd /var/www/project && composer install'"
Y finalmente, en este punto el &&
se ha movido a un conjunto interno de comillas, por lo que realmente no necesitamos las comillas alrededor del bash
comando... puedes soltarlos si lo prefieres.
docker exec [id] bash -c 'cd /var/www/project && composer install'
Todo lo que sigue a la identificación del contenedor es el comando a ejecutar, por lo que en el primer ejemplo -c
no es una opción para ejecutar, pero una ventana acoplable de comando intenta ejecutarse y falla porque ese comando no existe.
Lo más probable es que haya encontrado esta sintaxis de un docker run
comando donde el punto de entrada se estableció en /bin/sh
. Sin embargo, exec omite el punto de entrada, por lo que debe incluir el comando completo para ejecutar. Como han señalado otros, ese comando incluye un shell como bash o, en el siguiente ejemplo, sh:
docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'