Контейнер Docker завершает работу с кодом 0 после первоначального выполнения кода - PullRequest
0 голосов
/ 25 января 2019

У меня возникли некоторые трудности с контейнером Docker, который я развернул. Я адаптировал некоторый код, который импортирует метрики для EMC Isilon в базу данных InfluxDB для использования в Grafana. Мне удалось заставить код работать в контейнере, но сразу после первоначального выполнения контейнер завершает работу с кодом 0. Я на лету изучаю Docker, поэтому вполне возможно, что я упускаю что-то очевидное (пожалуйста, будьте осторожны, абсолютно прислушиваясь к советам, но не разрывайте меня на части, если что-то ужасно очевидно). Я знаю, что ссылки являются табу, но я собираюсь дать ссылку на оригинальную статью и используемое репозиторий git (дайте мне знать, если есть лучший способ справиться с этим).

Статья: https://community.emc.com/blogs/keith/2017/01/26/isilon-data-insights-connector--do-it-yourself-isilon-monitoring

Git Repo: https://github.com/Isilon/isilon_data_insights_connector

Я попытался установить stdin_open и tty в настроенном сервисе docker-compose. К сожалению, это единственное, что я нашел в сети, что могло поддерживать работу контейнера после выполнения.

[Докер-Compose]

  isilonscan:
    stdin_open: true
    tty: true
    build:
      args:
        - http_proxy=http://*****:3128
      context: ./Isilonscan/isilonscan-context
      dockerfile: Dockerfile
    volumes:
      - ./Isilonscan/isilonscan-data:/opt/isilon_data_insights_connector
      - ./Isilonscan/isi_data_insights_d.cfg:/opt/isilon_data_insights_connector/isi_data_insights_d.cfg
    depends_on:
      - influxdb
    command: ["python", "/opt/isilon_data_insights_connector/isi_data_insights_d.py", "start", "--config=/opt/isilon_data_insights_connector/isi_data_insights_d.cfg"]

[Dockerfile]

FROM python:2
WORKDIR /usr/src/app
COPY isilon-exporter /opt/isilon_data_insights_connector
RUN apt-get install git && \
cd /opt && \
git clone https://github.com/Isilon/isilon_data_insights_connector.git && \
cd ./isilon_data_insights_connector && \
#pip install --upgrade pip && \
#pip install --upgrade setuptools && \
pip install -r requirements.txt && \
apt-get remove git -y && \
apt-get clean all -y
ENTRYPOINT ["python", "/opt/isilon_data_insights_connector/isi_data_insights_d.py", "start", "--config=/opt/isilon_data_insights_connector/isi_data_insights_d.cfg"] 

Ожидаемое: Код должен запускаться и заканчиваться новой строкой. Каждые 30 секунд (или настроенный интервал) контейнер должен опрашивать Isilon для метрик и помещать их в InfluxDB (другой контейнер).

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

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Возможно, это не лучшее решение, но в итоге я использовал bash -c для запуска нескольких команд в опции команды в файле docker-compose.В конце я побежал tail -f /path/to/logfile.Похоже, в настоящее время работает, по крайней мере, пока я не найду лучшее решение.Можете обратиться к оригинальному разработчику и посмотреть, не захотят ли они добавить информацию о докере к своим материалам, чтобы упростить процесс развертывания.Они могут изменить свой код, чтобы он лучше работал в контейнере.

0 голосов
/ 25 января 2019

Есть много причин, по которым докер container может выйти. Например, быть убитым OOM убийцей и т. Д.

Поскольку ваш container сообщает о выходе как изящном (код возврата 0). Весьма вероятно, что процесс, выполняющий ваш скрипт isi_data_insights_d.py, остановился из-за того, что он выполнил весь необходимый код.

Поскольку в вашем скрипте .py больше ничего не выполняется, процесс завершается, и контейнер также завершается.

Хитрость в поддержании контейнера в том, чтобы держать основной процесс занятым. То есть скрипт / программа не должны выходить.

Что вы могли бы сделать, это обернуть весь код loop, а затем попросить процесс перейти на sleep на некоторое время, прежде чем проснуться, чтобы снова выполнить тот же код.

В качестве альтернативы вы можете использовать программу мониторинга процессов, такую ​​как supervisord, или вы можете написать другой скрипт на python для координации выполнения между скриптами. Что касается последнего, subprocess lib может быть хорошей помощью.

...