Я запускаю простое приложение 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 — это длительный процесс (это веб-сервер), поэтому он никогда не возвращает код выхода.
Вот почему я добавил амперсанд в конце: stackoverflow.com/questions/44222883/…
Если вы добавите амперсанд в конце команды, это означает, что она будет запущена в подоболочке, и исходный процесс продолжится со следующей командой. Это сработает. Но это плохая идея, потому что ваш сервер gunicorn больше не будет иметь pid 1 в контейнере. Это вызовет проблемы: например, будет невозможно завершить работу сервера в установленном порядке.
Итак, последняя строка вашего скрипта должна быть: exec gunicorn -b 0.0.0.0:5000 manage:app. Это заменяет процесс bash процессом gunicorn.
Если есть шаги, необходимые для подготовки: Их можно выполнить раньше в сценарии. Если вы хотите протестировать приложение после его запуска, это нужно будет сделать вне контейнера.
Как насчет использования nohup?
Та же проблема, что и с амперсандом, он запускает другую подоболочку.
Так что да, вероятно, лучше всего запустить пользовательский скрипт на другом шаге после команды docker run.
Отвечает ли это на ваш вопрос? Как запустить команду оболочки после службы пушки? это для файла docker enterypoint.sh






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