Estoy tratando de hacer dos comandos en docker exec. Concretamente, tengo que ejecutar un comando dentro de un directorio específico. Intenté esto, pero no funcionó:
docker exec [id] -c 'cd /var/www/project && composer install' El parámetro -c no se detecta. También probé esto:
docker exec [id] cd /var/www/project && composer install Pero el comando composer install se ejecuta después del comando docker exec . ¿Cómo puedo hacerlo?
En su primer ejemplo, le está dando el indicador -c a docker exec . Esa es una respuesta fácil: docker exec no tiene un indicador -c .
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, se ejecuta docker exec , y si sale de 0 (éxito), la composer install intentará ejecutarse localmente , fuera de Docker.
Lo que debe hacer es pasar ambos comandos como un solo argumento a docker exec usando una cadena. 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. Esto se debe a que cd es un shell integrado 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, && se ha movido a un conjunto interno de comillas, por lo que realmente no necesitamos las comillas alrededor del comando bash ... puede quitarlas si lo prefiere.
docker exec [id] bash -c 'cd /var/www/project && composer install'Todo lo que se encuentra 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 en un comando de docker run donde el punto de entrada se configuró 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'Las otras respuestas están bien si desea ejecutar 2 comandos arbitrarios. Pero si el primer comando es simplemente cd , entonces debería usar la opción -w para configurar el directorio de trabajo.
docker exec -w {dir} {container} {commands}Así que en tu ejemplo:
docker exec -w /var/www/project {container} composer install