Скрипт Docker-compose entrypoint останавливает контейнер с выходом 0

#ruby-on-rails #docker #docker-compose #docker-entrypoint

#ruby-on-rails #docker #docker-compose #docker-entrypoint

Вопрос:

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

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

Скрипт entrypoint:

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

bundle exec rake db:exists amp;amp; bundle exec rake db:migrate || bundle exec rake db:setup

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

  

Файл compose:

 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:
  

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

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

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

Ответ №1:

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

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

 exec "$@"
  

Комментарии:

1. Спасибо. Я думал, что внес небольшую правку в свой скрипт entrypoint, но я случайно удалил это.

Ответ №2:

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

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

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

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

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

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

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