Es imprescindible comprender el código de forma correcta previamente a aplicarlo a tu proyecto si tdeseas aportar algo puedes comentarlo.
Solución:
En su primer ejemplo, usted está dando el -c
bandera a docker exec
. Esa es una respuesta fácil: docker exec
no tiene una -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á correr en la zonafuera de Docker.
Lo que debe hacer es pasar ambos comandos como un solo argumento para docker exec
usando un string. Entonces no serán interpretados por una concha 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 después de 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 se estableció el punto de entrada /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'
Las otras respuestas están bien si desea ejecutar 2 comandos arbitrarios. Pero si el primer comando es simplemente cd
entonces debes usar el -w
opción para establecer el directorio de trabajo en su lugar.
docker exec -w dir container commands
Así que en tu ejemplo:
docker exec -w /var/www/project container composer install
Nos puedes añadir valor a nuestro contenido informacional añadiendo tu veteranía en las notas.