2015-10-08 12 views
24

voglio eseguire uno script, subito dopo l'esecuzionefinestra mobile-composizione yml esecuzione di uno script dopo un massimo

`docker-compose up -d` 

Ecco il mio frammento di docker-compose.yml. Le altre impostazioni sono server MySQL, Redis ... ecc .... ma non stanno causando problemi

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 

Così ogni volta che ho eseguito docker-compose up -d oder docker-compose up tutto si ferma. (i contenitori non continuano a funzionare). Anche se il mio script di shell è semplice (eseguendo echos ... o phpunit). Ecco la mia sceneggiatura.

#!/bin/bash 

echo running post install scripts for web..; 
cd /srv/myweb 
npm install 
composer self-update 
composer update 

E questo è l'errore che ottengo. È come se il server (nginx) non fosse ancora in esecuzione. Inoltre se mi collego al server usando exec bash, e controllo i processi. Non vedo nginx in esecuzione (ancora).

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 

quindi perché è in esecuzione, sebbene lo script sia corretto per la sintassi? come posso farlo funzionare correttamente? (cosa sto facendo, impostazione sbagliata!)

+0

Il tuo tentativo di far funzionare automaticamente le cose dopo o è ok? puoi usare 'docker exec $ (docker-compose ps -q web) some_command' per eseguire le cose in un contenitore già in esecuzione. –

risposta

24

command sovrascrive il comando predefinito.

Questo è il motivo per cui il contenitore si arresta: nginx non si avvia mai.

Alla fine dello script è necessario eseguire nginx

#!/bin/bash 

echo running post install scripts for web..; 
cd /srv/myweb 
npm install 
composer self-update 
composer update 
nginx 

A proposito, vi consiglio di cambiare lo script ed eseguire npm install e composer *update solo se necessario (quindi solo se qualche file in/src/myweb non esiste), perché fa in modo che il tempo di avvio del contenitore aumenti invano.

Nota che così facendo NginX non catturerà mai il segnale SIGTERM inviato dalla finestra mobile. Ciò può causare la sua morte improvvisa.

Invece, se si vuole essere sicuri che SIGTERM sia ricevuto da nginx, è necessario sostituire l'ultima riga con exec nginx. Questo sostituisce il processo bash con nginx stesso.

+1

Dovrai cambiare quell'ultima riga in 'exec nginx', il che significa che lo script di bash sarà sostituito da nginx, invece di generare un nuovo processo. Questo è necessario in modo che la finestra mobile possa trasmettere segnali come SIGTERM a nginx. Maggiori informazioni su http://veithen.github.io/2014/11/16/sigterm-propagation.html – chadn

+0

Ottimo punto. Ho intenzione di aggiornare la risposta aggiungendo il tuo suggerimento. Grazie! – nessuno

Problemi correlati