bash - run - docker-compose yml ejecutando un script después
docker run bash into container (1)
Quiero ejecutar un script, justo después de ejecutar
`docker-compose up -d`
Aquí está mi fragmento de docker-compose.yml
. Las otras configuraciones son mysql server, redis ... etc .... pero no están causando ningún problema
web:
image: nginx
container_name: web-project
volumes:
- ./code:/srv
working_dir: /srv/myweb
extra_hosts:
- "myweb.local:127.0.0.1"
ports:
- 8081:80
# tty: true
command: sh /srv/scripts/post-run-web.sh
Así que cada vez que ejecuto docker-compose up -d
o docker-compose up
Todo se detiene. (los contenedores no siguen funcionando). Aunque mi script de shell es simple (ejecuta echos ... o phpunit). Aquí está mi script.
#!/bin/bash
echo running post install scripts for web..;
cd /srv/myweb
npm install
composer self-update
composer update
Y este es el error que obtengo Es como si el servidor (nginx) aún no se ejecutara. También si me conecto al servidor usando exec bash, y reviso los procesos. No veo ejecutar nginx (todavía).
web_1 | You are already using composer version 7a9eb02190d334513e99a479510f87eed18cf958.
web_1 | Loading composer repositories with package information
web_1 | Updating dependencies (including require-dev)
web_1 | Generating autoload files
web-project exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping mysql-project... done
Stopping rabbitmq-project... done
Stopping redis-project... done
Entonces, ¿por qué está saliendo, aunque el guión es correcto en cuanto a la sintaxis? ¿Cómo puedo hacer que funcione correctamente? (¿Qué estoy haciendo, configurar mal!)
command anula el comando predeterminado.
Esa es la razón por la que su contenedor se detiene: nginx nunca se inicia.
Al final de tu script, debes ejecutar nginx
#!/bin/bash
echo running post install scripts for web..;
cd /srv/myweb
npm install
composer self-update
composer update
nginx
Por cierto, te sugiero que cambies tu script y npm install
and composer *update
solo si es necesario (solo si algún archivo en / src / myweb no existe), ya que hace que el tiempo de inicio de tu contenedor sea en vano.
Tenga en cuenta que al hacerlo, NginX nunca captará la señal SIGTERM enviada por Docker Stop. Eso puede causar que sea abruptamente asesinado.
En cambio, si quiere estar seguro de que nginx recibe SIGTERM, debe reemplazar la última línea con exec nginx
. Esto reemplaza el proceso bash con nginx en sí mismo.