2015-10-08 19 views
24

Chcę uruchomić skrypt, tuż po uruchomieniudoker-komponować yml uruchomienie skryptu po up

`docker-compose up -d` 

Tu jest mój urywek docker-compose.yml. Pozostałe ustawienia serwera mysql, Redis ... itd .... ale nie powodują żadnych problemów

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 

Więc kiedy biegnę docker-compose up -d oder docker-compose up on wszystkie przystanki. (pojemniki nie działają). Chociaż mój skrypt powłoki jest prosty (działający echos ... lub phpunit). Oto mój skrypt.

#!/bin/bash 

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

I to jest błąd, który dostaję. To tak, jakby serwer (nginx) jeszcze nie działał. Również jeśli łączę się z serwerem za pomocą exec bash, a ja sprawdzam procesy. Nie widzę działającego nginx (jeszcze).

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 

dlaczego więc wychodzi, chociaż skrypt jest poprawny pod względem składni? jak mogę go uruchomić poprawnie? (co ja robię, konfiguruję źle!)

+0

Twoja próba sprawienia, że ​​rzeczy zostaną automatycznie uruchomione po zakończeniu lub ręcznie? możesz użyć 'docker exec $ (docker-compose ps -q web) some_command', aby uruchomić rzeczy w już działającym kontenerze. –

Odpowiedz

24

command zastępuje domyślne polecenie.

Oto powód zatrzymania kontenera: nginx nigdy się nie uruchamia.

Na końcu skryptu trzeba uruchomić nginx

#!/bin/bash 

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

Nawiasem mówiąc, proponuję zmienić scenariusz i uruchomić npm install i composer *update tylko w razie potrzeby (a więc tylko wtedy, gdy jakiś plik w/src/myweb nie istnieje), ponieważ sprawia, że ​​czas uruchamiania twojego kontenera wzrośnie na próżno.

Należy pamiętać, że w ten sposób NginX nigdy nie będzie przechwytywał sygnału SIGTERM wysyłanego przez przystanek dokowania. To może spowodować, że zostanie nagle zabity.

Zamiast tego, jeśli chcesz mieć pewność, że SIGTERM jest odbierany przez nginx, musisz zastąpić ostatnią linię przez exec nginx. Zastępuje to proces bash samym nginxem.

+1

Będziesz chciał zmienić ten ostatni wiersz na 'exec nginx', co oznacza, że ​​twój skrypt bash zostanie zastąpiony przez nginx zamiast tworzenia nowego procesu. Jest to konieczne, aby moduł dokowania mógł przekazywać sygnały takie jak SIGTERM do nginx. Więcej na http://veithen.github.io/2014/11/16/sigterm-propagation.html – chadn

+0

Bardzo dobry punkt. Zamierzam zaktualizować odpowiedź, dodając Twoją sugestię. Dziękuję Ci! – nessuno

Powiązane problemy