Подтвердить что ты не робот

Docker-compose yml запускает script после

Я хочу запустить script, сразу после запуска

`docker-compose up -d` 

Вот мой фрагмент docker-compose.yml. Другие настройки - сервер mysql, redis... и т.д., Но они не вызывают никаких проблем.

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 oder docker-compose up, все останавливается. (контейнеры не работают). Хотя моя оболочка script проста (работает echos... или phpunit). Вот мой script.

#!/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

так почему он выходит, хотя script является синтаксически правильным? как я могу заставить его работать правильно? (что я делаю, устанавливаю неправильно!)

4b9b3361

Ответ 1

command отменяет команду по умолчанию.

Это причина, по которой останавливается ваш контейнер: nginx никогда не запускается.

В конце вашего script вам нужно запустить nginx

#!/bin/bash

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

Кстати, я предлагаю вам изменить ваш script и запустить npm install и composer *update только в случае необходимости (таким образом, только если какой-либо файл в /src/myweb не существует), поскольку он запускает ваш контейнер увеличение времени напрасно.

Обратите внимание, что при этом NginX никогда не поймает сигнал SIGTERM, отправленный приложением докера. Это может привести к его внезапному убийству.

Вместо этого, если вы хотите быть уверенным, что SIGTERM получен nginx, вы должны заменить последнюю строку на exec nginx. Это заменяет процесс bash на сам nginx.