Docker-compose скрипт точки входа останавливает контейнер с выходом 0 - PullRequest
0 голосов
/ 15 марта 2019

После выполнения моего сценария точки входа контейнеры останавливаются с выходом 0. Команда, указанная в файле compose, который запускает наш веб-сервер, игнорируется.

Мы используем docker с docker-compose в качестве среды для нашегоприложения rails.

Сценарий точки входа:

#! /bin/bash
bundle exec rails assets:clobber
bundle exec rails assets:precompile

bundle exec rake db:exists && bundle exec rake db:migrate || bundle exec rake db:setup

rm -rf /aps/tmp/pids/server.pid

Файл компоновки:

version: '2'
services:
  app:
    image: registry.gitlab.com/.../.../master:latest
    command: bundle exec rails server
    entrypoint: /aps/rails-entrypoint.sh
    volumes:
      - /srv/app/log/:/app/log
      - /srv/app/public/:/app/public
    env_file: .env
    ports:
      - '0.0.0.0:3333:3000'
    links:
      - apppostgres

  apppostgres:
    image: postgres
    ...


volumes:
  pgdata:

Когда я подключаюсь к контейнеру во время работы сценария точки входа, я вижувыполненная команда, запущенная с ps aux как /bin/bash /app/rails-entrypoint.sh bundle exec rails server.

Когда я добавляю свой командный блок в скрипт точки входа, сервер запускается и работает, но это не так, как он должен работать или?

Что я могу сделать, чтобы скрипт точки входа и блок команд работали так, как должны?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

После выполнения моего скрипта точки входа контейнеры останавливаются

Это в значительной степени определение: когда точка входа завершает выход из контейнера.

Команда, указанная в файле compose, который запускает наш веб-сервер, игнорируется.

Он передается в качестве аргументов командной строки точке входа, и ваш сценарий должен делать с ней все, что ему нужно.

Самое распространенное, что нужно сделать, это выполнить аргументы командной строки без изменений:

#!/bin/sh
# ... do pre-launch setup ...
exec "$@"

(ENTRYPOINT и CMD не объединяются самостоятельно, чтобы позволить вам выполнить в контейнере две вещи по порядку: только точка входа запускается, получая команду в качестве параметров и время жизни контейнера точно соответствует времени жизни точки входа.)

1 голос
/ 15 марта 2019

Когда вы запускаете контейнер, то процесс, который инициировал контейнер - entrypoint.sh в вашем случае - будет считаться pid 1, так как пока этот процесс работает, ваш контейнер остается в рабочем состоянии и если он умирает или останавливается дляПо какой бы причине он не остановил контейнер со статусом выхода 0 или выше, зависит от фактического статуса выхода основного процесса.

Вам нужно добавить следующее в конце вашей точки входа, чтобы заставить его работатьс bundle exec rails server

exec "$@"
...