В контейнере Docker, по-видимому, произошел сбой / etc / hosts до запуска _interactive_ docker - PullRequest
0 голосов
/ 29 мая 2019

Если я "запускаю службу docker-compose" в интерактивном терминале (не -it, а интерактивно, на хосте запущен bash), моя служба успешно инициализируется.

Но если я добавлю эту же команду в сценарий оболочки, она потерпит неудачу.

Я подозреваю, что проблема в разрешении имен через / etc / hosts; кажется, что он работает в интерактивном режиме, но не по какой-либо причине Я хочу, чтобы контейнеры могли видеть имена, определенные в файле / etc / hosts. И хотя я использую Linux Mint 19.1, он мне нужен для работы в Windows, Mac и Linux.

То, что я пробовал, не сработало:

  1. Добавление снов - до 10 минут
  2. Проверка на различия в переменных среды
  3. Запуск команды под tcsh вместо bash
  4. Выполнение команды в псевдо-tty с использованием / usr / bin / script -c

Но если я добавлю / bin / bash -i в мой скрипт с эхом, который говорит, какую команду набирать, это сработает!

Я использую:

docker version 18.09.6, build 481bc77
docker-compose version 1.24.0, build 0aa59064

Мне нужно получить разрешение от моего руководства, чтобы поделиться не только небольшими фрагментами кода.

Я хочу, чтобы служба запускалась через docker-compose up -d или хотя бы docker-compose start - в сценарии, для автоматизации.

Сообщение об ошибке внутри контейнера (из службы docker logs -f) выглядит следующим образом: asticsearch.exceptions.ConnectionTimeout: ConnectionTimeout, вызванный - ReadTimeoutError (HTTPConnectionPool (host = u'elasticsearch ', port = 9200): тайм-аут чтения. (тайм-аут чтения = 10))

Я иногда вижу высокую нагрузку в эластичном поиске, которая кажется немного странной. Под высоким я имею в виду 490% на 8 ядрах (вероятно, считая гиперпоточность). Чаще всего он падает примерно на 5-15%.

Вот SSCCE:

#!/bin/bash

set -eu
set -o pipefail
set -x

docker stop elasticsearch || true
docker-compose start elasticsearch

# Give elasticsearch some time to come up.
# Normally I use a small REST client that calls ES until it starts responding - but that wouldn't be self-contained.
sleep 120

docker stop service || true
docker-compose start service

Сценарий сам по себе прекрасно работает, но затем «service» завершается раньше, чем должен.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

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

Во всяком случае, хотите верьте, хотите нет, но мне кажется, что (100)

script -q -c "docker-compose up -d \"elasticsearch\"" /dev/null

... решил проблему.

Странно, я знаю, но в настоящее время я не собираюсь выяснять, почему. Я просто счастлив, что это работает.

0 голосов
/ 31 мая 2019

Если я правильно понял, вы хотите, чтобы контейнер elasticsearch обслуживал ваш контейнер service (т. Е. Оба контейнера связывались друг с другом), следовательно, контейнеру service необходимо знать IP-адрес elasticsearch.

В этом случае docker-compose будет управлять адресами контейнеров, и вам нужно будет сохранить эту информацию в сервисном контейнере как переменную среды.Плюсом этого является то, что вы можете запустить оба контейнера с помощью одной и той же команды (просто docker-compose up -d).Например:

services:
  elasticsearch:
      image: YOUR_ELASTICSEARCH_IMAGE
      ports:
        - 9200:9200
  service:
      image: YOUR_SERVICE_IMAGE
      environment:
          - ELASTICSEARCH_HOST=elasticsearch

Если существует зависимость между контейнерами и контейнеру elasticsearch требуется некоторое время для запуска, то вы можете либо поместить оператор сна в service при запуске, либо использовать решениев 31746182

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...