Запустить команду оболочки после запуска службы Gunicorn в контейнере Docker

Я запускаю простое приложение Python Flask, используя Gunicorn. Я хочу запустить службу Gunicorn, а затем запустить собственный сценарий оболочки после запуска службы.

Что-то вроде этого:

FROM python:3.6.5-slim

RUN apt-get update \
  && apt-get clean \
  && apt-get install -qq -y git build-essential libpq-dev --no-install-recommends \
  && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["entrypoint.sh"]

Цель состоит в том, чтобы запустить my_custom_script.sh после запуска службы Gunicorn (в настоящее время не будет работать):

#!/bin/sh

echo "Waiting for postgres..."
while ! nc -z postgres 5432; do
  sleep 0.1
done

echo "PostgreSQL started"
gunicorn -b 0.0.0.0:5000 manage:app

bash my_custom_script.sh

Сценарий просто создает базы данных, запускает некоторые тесты и добавляет некоторые данные о фактах.

просто чтобы что-то уточнить, использование gunicorn -b 0.0.0.0:5000 manage:app & не работает?

Arne 28.03.2019 08:54

gunicorn -b 0.0.0.0:5000 manage:app — это длительный процесс (это веб-сервер), поэтому он никогда не возвращает код выхода.

Jason Strimpel 28.03.2019 08:56

Вот почему я добавил амперсанд в конце: stackoverflow.com/questions/44222883/…

Arne 28.03.2019 09:00

Если вы добавите амперсанд в конце команды, это означает, что она будет запущена в подоболочке, и исходный процесс продолжится со следующей командой. Это сработает. Но это плохая идея, потому что ваш сервер gunicorn больше не будет иметь pid 1 в контейнере. Это вызовет проблемы: например, будет невозможно завершить работу сервера в установленном порядке.

Carl Düvel 28.03.2019 09:03

Итак, последняя строка вашего скрипта должна быть: exec gunicorn -b 0.0.0.0:5000 manage:app. Это заменяет процесс bash процессом gunicorn.

Carl Düvel 28.03.2019 09:07

Если есть шаги, необходимые для подготовки: Их можно выполнить раньше в сценарии. Если вы хотите протестировать приложение после его запуска, это нужно будет сделать вне контейнера.

Carl Düvel 28.03.2019 09:11

Как насчет использования nohup?

Jason Strimpel 28.03.2019 09:15

Та же проблема, что и с амперсандом, он запускает другую подоболочку.

Arne 28.03.2019 09:43

Так что да, вероятно, лучше всего запустить пользовательский скрипт на другом шаге после команды docker run.

Arne 28.03.2019 09:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
10
753
0

Другие вопросы по теме