web-dev-qa-db-ja.com

起動後にスクリプトを実行するdocker-compose yml

実行直後にスクリプトを実行したい

`docker-compose up -d` 

これがdocker-compose.ymlのスニペットです。その他の設定はmysqlサーバー、redis ... etc ....ですが、問題は発生していません

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

したがって、docker-compose up -dまたはdocker-compose upを実行すると、すべて停止します。 (コンテナは実行し続けません)。私のシェルスクリプトは単純ですが(エコーの実行...またはphpunit)。これが私のスクリプトです。

#!/bin/bash

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

そして、これは私が得るエラーです。サーバー(nginx)がまだ実行されていないようです。また、exec bashを使用してサーバーに接続し、プロセスをチェックアウトするとします。 (まだ)nginxが実行されていません。

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

スクリプトは構文的には正しいのに、なぜ終了するのでしょうか?どうすれば正しく実行できますか? (設定を間違えています!)

32
Confidence

command はデフォルトのコマンドを上書きします。

それがコンテナが停止する理由です:nginxは決して起動しません。

スクリプトの最後で、nginxを実行する必要があります

#!/bin/bash

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

ところで、スクリプトを変更して、npm installcomposer *updateを必要な場合にのみ実行することをお勧めします(したがって、/ src/myweb内のファイルが存在しない場合のみ)。無駄に増加します。

そうすることで、NginXはdocker stopによって送信されたSIGTERMシグナルをキャッチしないことに注意してください。それは突然それを殺すことができます。

代わりに、SIGTERMがnginxによって確実に受信されるようにする場合、最後の行をexec nginxに置き換える必要があります。これにより、bashプロセスがnginx自体に置き換えられます。

31
nessuno