Запуск docker-compose с помощью Python 'fabric' - PullRequest
4 голосов
/ 25 марта 2019

Я использую Docker (+ Docker Compose).Все docker-compose взаимодействие происходит через пакет Python ' fabric ' (v1).

Пример:

def runserver():
    local('docker-compose up')

и:

$ fab runserver

Все ведет себя нормально, пока я не попытаюсь ^C из запущенного docker-compose up:

  1. docker-compose, кажется, получает сигнал ^C (SIGINT?), Когда он начинает останавливать мойконтейнеры - например:
Stopping celery-export ... done
Stopping celery        ...

Однако во время процесса остановки контейнера (иногда до 10 секунд, если контейнер не реагирует на сигналы должным образом), я могу нажать клавишу ввода / возврата и посмотреть /взаимодействовать с моей оболочкой (как если бы процесс завершился).

Хотя на этом этапе контейнеры еще не закончили останавливаться (рядом с каждой Stopping ... строкой нет done).Как будто мне преждевременно предоставили доступ к моей оболочке, которую я могу свободно использовать.Если контейнер с поздним завершением остановится (обычно через 10 секунд), он нарисует линию done над тем, что я сейчас делаю в своем терминале.

Пример:

Stopping celery-export ... done
Stopping celery        ...
Stopping redis         ...

$ uptime 
10:54  up 1 day, 17:22, 2 users, load averages: 1.73 1.94 1.92
Stopping celery        ... done
Stopping redis         ... done

Этого не происходит, когда я вызываю docker-compose up напрямую (вне структуры), поэтому я подозреваю, что это как-то связано с фабрикой, обертывающей выполнение команды.

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

Простите, что у меня нет правильной терминологии для описания этой проблемы, и если это было бы более уместно в Superuser вместо SO.

Ответы [ 3 ]

2 голосов
/ 31 марта 2019

Я хотел бы ответить, мой ответ - это мое видение вашей проблемы:

  1. фабрика запускает команду по конфигурации и останавливается.
  2. команда docker-compose up: Создает, (повторно) создает, запускает и присоединяет контейнеры для службы .Когда ключевое слово присоединить .При запуске:
docker-compose up

Затем последняя операция attach для контейнера (службы).Например, следующий docker-compose.yaml:

version: "3.6"


services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"

если вы запустите docker-compose up, вы увидите следующий вывод:

Starting fabric_nginx_1 ... done
Attaching to fabric_nginx_1

Когда Attaching to fabric_nginx_1 успешно завершится, присоединение к nginxсервер.Ctrl-C или SIGINT, отправленные на эту консоль, остановят процесс и контейнер nginx (сервис).

Чтобы запустить процесс / контейнер / службу в качестве демона, вам нужно запустить docker-compose detached и использовать ключ -d / - detach.

docker-compose up -d

Тогда ваша служба будет работать какоказание услуг.Для остановки вы должны использовать:

  1. docker-compose stop или
  2. docker-compose kill или
  3. docker-compose down

Вывод: В вашем случае все работает как задумано.Fabric запускает команду docker-compose и останавливается.docker-compose создавать контейнеры, запускать их и останавливаться.Поведение контейнера по его собственному содержимому упаковано в контейнер.

1 голос
/ 03 апреля 2019

Как уже упоминалось, использование Ctrl + C, похоже, убивает Fabric в вашем случае.Команда SSH по-прежнему выполняется в фоновом режиме, и вы выводите ее на консоль до ее завершения.

Вместо того, чтобы делать это таким образом, я предлагаю вам использовать docker-compose up -d, поэтому Fabric завершает работу после того, как все контейнеры завершены.вверх.Если вы хотите привязать логи, вы должны добавить еще одну команду Fabric, которая будет выполнять docker-compose logs.Когда вы нажмете Ctrl + C, он должен быстро закончиться и не работать в фоновом режиме, как up.Если вы хотите остановить контейнеры, используйте docker-compose stop.

0 голосов
/ 31 марта 2019

Я использую docker-compose up (за пределами Fabric) во время тестирования.Часто, когда я нажимаю Ctrl + C, не все изображения завершаются, прежде чем я возвращаюсь в командную строку.На самом деле, Redis часто работает в фоновом режиме.Повторный запуск docker-compose up даже приводит к отображению сообщений Redis, накопленных после нажатия Ctrl + C.

В моем случае подходящий обходной путь, чтобы убедиться, что все «мертво», я использую docker kill $(docker ps -q).Это убивает любые бегущие образы.

...