Quiero hacer algo como esto donde puedo ejecutar varios comandos en orden.
db:
image: postgres
web:
build: .
command: python manage.py migrate
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
docker
yaml
docker-compose
RustyShackleford
fuente
fuente
/bin/bash
sh
en su lugar:[sh, -c, "cd /usr/src/app && npm start"]
ash
en alpino :)Ejecuto cosas previas al inicio como migraciones en un contenedor efímero separado, así (nota, componer archivo debe ser del tipo de versión '2'):
Esto ayuda a mantener las cosas limpias y separadas. Dos cosas a tener en cuenta:
Debe asegurarse de la secuencia de inicio correcta (usando depende_en)
desea evitar múltiples compilaciones, lo cual se logra etiquetándolo la primera vez usando compilación e imagen; puede referirse a la imagen en otros contenedores y luego
fuente
bash -c
anterior.Recomiendo usar
sh
en lugar debash
porque está más disponible en la mayoría de las imágenes basadas en Unix (alpina, etc.).Aquí hay un ejemplo
docker-compose.yml
:Esto llamará a los siguientes comandos en orden:
python manage.py wait_for_db
- espera a que el db esté listopython manage.py migrate
- ejecutar cualquier migraciónpython manage.py runserver 0.0.0.0:8000
- iniciar mi servidor de desarrollofuente
>
se usa para iniciar una entrada de varias líneas (consulte stackoverflow.com/a/3790497/2220370 )Esto funciona para mi:
docker-compose intenta desreferenciar las variables antes de ejecutar el comando, por lo que si desea que bash maneje las variables, deberá escapar de los signos de dólar al duplicarlas ...
... de lo contrario obtendrá un error:
fuente
$${Types}
y$${Client}
. Creo que esto evitará que docker compose interprete esas variables y busque sus valores en cualquier shell desde el que invoque docker-compose, lo que significará que todavía están disponibles para que bash los desreferencia ( después de que docker haya procesado su.env
archivo).Puede usar el punto de entrada aquí. El punto de entrada en la ventana acoplable se ejecuta antes del comando, mientras que el comando es el comando predeterminado que se debe ejecutar cuando se inicia el contenedor. Por lo tanto, la mayoría de las aplicaciones generalmente llevan el procedimiento de configuración en el archivo de punto de entrada y en el último permiten que se ejecute el comando.
hacer un archivo de script de shell puede ser como
docker-entrypoint.sh
(el nombre no importa) con los siguientes contenidos.en el archivo docker-compose.yml utilícelo con
entrypoint: /docker-entrypoint.sh
y registre el comando comocommand: python manage.py runserver 0.0.0.0:8000
PS: no olvide copiardocker-entrypoint.sh
junto con su código.fuente
docker-compose run service-name ....
Otra idea:
Si, como en este caso, crea el contenedor, simplemente coloque un script de inicio y ejecútelo con el comando. O monte el script de inicio como volumen.
fuente
#!/bin/bash \n python manage.py migrate \n python manage.py runserver 0.0.0.0:8000
(feo en línea)* ACTUALIZACIÓN *
Pensé que la mejor manera de ejecutar algunos comandos es escribir un Dockerfile personalizado que haga todo lo que quiera antes de que el CMD oficial se ejecute desde la imagen.
docker-compose.yaml:
Dockerfile.mongo:
Esta es probablemente la forma más limpia de hacerlo.
* VIEJA FORMA *
Creé un script de shell con mis comandos. En este caso, quería comenzar
mongod
y ejecutar,mongoimport
pero llamandomongod
te impide ejecutar el resto.docker-compose.yaml :
start_mongod.sh :
Entonces esto bifurca a mongo, monogimporta y luego mata al mongo bifurcado que se separa, y lo inicia nuevamente sin separarse. No estoy seguro de si hay una manera de adjuntar a un proceso bifurcado, pero esto funciona.
NOTA: Si desea cargar estrictamente algunos datos de db iniciales, esta es la forma de hacerlo:
mongo_import.sh
Los archivos mongo_fixtures / *. json se crearon mediante el comando mongoexport.
docker-compose.yaml
fuente
Si necesita ejecutar más de un proceso de demonio, hay una sugerencia en la documentación de Docker para usar Supervisord en un modo no separado para que todos los sub-demonios salgan al stdout.
De otra pregunta de SO, descubrí que puede redirigir los procesos secundarios a la salida estándar. ¡De esa manera puedes ver toda la salida!
fuente
Para ejecutar varios comandos en el archivo docker-compose utilizando
bash -c
.Fuente: https://intellipaat.com/community/19590/docker-run-multiple-commands-using-docker-compose-at-once?show=19597#a19597
fuente
Use una herramienta como esperar o dockerize . Estos son pequeños scripts de contenedor que puede incluir en la imagen de su aplicación. O escriba su propio script de contenedor para ejecutar comandos más específicos de la aplicación. de acuerdo con: https://docs.docker.com/compose/startup-order/
fuente
Me topé con esto mientras intentaba configurar mi contenedor jenkins para construir contenedores docker como usuario jenkins.
Necesitaba tocar el archivo docker.sock en el Dockerfile mientras lo enlazo más adelante en el archivo docker-compose. A menos que lo haya tocado primero, todavía no existe. Esto funcionó para mí.
Dockerfile:
docker-compose.yml:
fuente
intente usar ";" para separar los comandos si está en la versión dos, por ejemplo
command: "sleep 20; echo 'a'"
fuente