Как я могу сказать моему сценарию ждать, пока консул выберет лидера, прежде чем пытаться добавить к нему пары ключ / значение при запуске?

Моя среда разработки состоит из локального сервера консула в одном контейнере и моего приложения (с запущенным шаблоном консула) в другом, все они связаны с docker-compose. Я хочу, чтобы все запускалось плавно и без ручного вмешательства в разработку (безопасность не является проблемой), и поэтому я хотел бы программно добавить пары ключ / значение по умолчанию в consul при запуске путем монтирования определенного файла.

Я постоянно сталкиваюсь с этой проблемой, когда всякий раз, когда я пытаюсь добавить пары k / v в consul при запуске с помощью API, это не удается с ошибкой 2016/06/03 21:10:15 [ERR] http: Request PUT /v1/kv/app/secret_key, error: No cluster leader from=[::1]:58888. Если я добавлю заранее команду сна, давая консулу достаточно времени для выбора лидера, это сработает. Но должен быть лучший способ сделать это синхронно, не так ли? Особенно, когда в кластере всегда есть только один узел.

Это то, что у меня есть до сих пор.

Dockerfile

FROM voxxit/consul

ARG REFRESHED_AT="2016-06-01"
ARG DOCKERIZE_VERSION="v0.2.0"
ENV CONSUL_ADDR="http://localhost:8500"

ADD "https://github.com/jwilder/dockerize/releases/download/${DOCKERIZE_VERSION}/dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz" /tmp
RUN set -x && \
    apk add --update curl jq && \
    cd /tmp && \
    tar -C /usr/local/bin -xzvf dockerize-linux-amd64-${DOCKERIZE_VERSION}.tar.gz && \
    rm -rf /var/cache/apk/* /tmp/*

RUN mkdir -p /etc/consul.d/data
COPY ./consul.json /etc/consul.d/
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh

WORKDIR /etc/consul.d/data
VOLUME ["/etc/consul.d/data"]

ENTRYPOINT ["/entrypoint.sh"]
CMD ["dockerize", "-stdout", "/var/log/consul.out", "-stderr", "/var/log/consul.err"]

entrypoint.sh

#!/bin/bash -e

# Start consul server and wait for it
nohup consul agent -config-file=/etc/consul.d \
    >/var/log/consul.out 2>/var/log/consul.err &
dockerize -wait "${CONSUL_ADDR}" # <-- Not working as I'd hoped

DEFAULT_CONFIG="/etc/consul.d/data/default.json"

if [ -f $DEFAULT_CONFIG ]; then
    # Bulk upload default k/v pairs
    while IFS=" " read -r key value; do
        prefix="${APP_NAME}"
        result=$(curl -s -X PUT -d "$value" "${CONSUL_ADDR}/v1/kv/${prefix}/${key}")
        if [ "$result" != "true" ]; then
            echo "ERROR loading $value into $key for $prefix"
            exit 1
        fi
    done < <(jq -r 'to_entries|map("\(.key) \(.value|tostring)")|.[]' $DEFAULT_CONFIG)
fi

echo "init complete - ready for start up"
exec "$@"

consul.json

{
"bootstrap": true,
"client_addr": "0.0.0.0",
"data_dir": "/data",
"enable_syslog": false,
"log_level": "INFO",
"server": true,
"ui_dir": "/ui",
"http_api_response_headers": {
    "Access-Control-Allow-Origin": "*"
}
}

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


person BDuelz    schedule 05.06.2016    source источник
comment
Можете ли вы поделиться докер-сочинением ур консула? вы не устанавливаете -bootstrap-expect = 1?   -  person Shibashis    schedule 05.06.2016
comment
Я этого не пробовал. У меня создалось впечатление, что bootstrap-expect предназначен для кластеров ›1.   -  person BDuelz    schedule 05.06.2016
comment
@Shibashis Я просто попытался добавить "bootstrap_expect": 1 в приведенную выше конфигурацию и получил эту ошибку ==> Bootstrap cannot be provided with an expected server count   -  person BDuelz    schedule 05.06.2016
comment
да. У вас есть docker consul server где-нибудь еще? или это локальная установка, в которой вы хотите запустить один экземпляр консула?   -  person Shibashis    schedule 05.06.2016
comment
Последний. Это установка для разработки, над которой я работаю.   -  person BDuelz    schedule 05.06.2016
comment
где вы устанавливаете ожидаемое количество серверов? в yml этого нет   -  person Shibashis    schedule 05.06.2016
comment
Позвольте нам продолжить это обсуждение в чате.   -  person BDuelz    schedule 05.06.2016


Ответы (1)


У меня возникла аналогичная проблема, и я решил свою проблему (Bootstrap cannot be provided with an expected server count), указав количество ожидаемых узлов Consul (используя аргумент командной строки -bootstrap-expect=5) вместо простого -boostrap на одном узле.

person Nicolas Henneaux    schedule 12.04.2017
comment
Я не понимаю, какое отношение имеет количество узлов к ожиданию выбора мастера? - person Chris Stryczynski; 13.10.2020