Контейнер докеров, похоже, не работает /etc/hosts до запуска _interactive_ docker

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

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

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

Вещи, которые я пробовал, которые не работали:

  1. Добавление сна - до 10 минут
  2. Проверка различий переменных среды
  3. Запуск команды под tcsh вместо bash
  4. Запуск команды в псевдотерминале с использованием /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 service) выглядит так: elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout, вызванный - ReadTimeoutError (HTTPConnectionPool (host = u'elasticsearch', port = 9200): время ожидания чтения истекло. (время ожидания чтения = 10))

Иногда я вижу высокую нагрузку в elasticsearch, что кажется немного странным. Под высоким я подразумеваю до 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

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

Спасибо!

Сценарий и точное сообщение об ошибке могут помочь другим людям помочь вам. Если вы не можете поделиться конкретным кодом, почти всегда есть решение создать минимальный воспроизводимый пример

Zeitounator 29.05.2019 17:47

Спасибо. Я работаю над SSCCE.

dstromberg 29.05.2019 18:00

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

user7440787 30.05.2019 16:40

Я думаю, что эта проблема связана с этим один

user7440787 30.05.2019 16:48

@user7440787 user7440787 Я использую «вверх» при первом запуске контейнера и «старт» при последующих запусках контейнера.

dstromberg 30.05.2019 18:21

@ user7440787 Вопрос 31746182 действительно выглядит несколько уместным, хотя я подозреваю, что мне нужно подождать чего-то внутри контейнера, особенно для появления псевдо-DNS, чтобы он мог разрешить проблемы в /etc/hosts хоста.

dstromberg 30.05.2019 18:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если я правильно понял, вы хотите, чтобы контейнер 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.

Да, «сервис» зависит от elasticsearch. Что касается переменных окружения: нам нужно об этом подумать. У нас есть системы разработки, в которых есть elasticsearch на 127.0.0.1, и наши производственные среды, где elasticsearch — это что-то другое. Поэтому, если мы можем установить разные значения переменных среды для разных систем, это может сработать, особенно если это означает частое изменение нашего yaml в докере.

dstromberg 31.05.2019 18:47

Еще странно, что иногда разрешение имен работает, а иногда нет. :-С

dstromberg 31.05.2019 18:47
Ответ принят как подходящий

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

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

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

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

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

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