我怎么能告诉我的脚本,等待领事选举领导人,然后再尝试在启动时添加键/值对呢?

我的开发环境由一个容器中的一个本地领事服务器和另一个容器中的我的应用程序(与领导模板一起运行)组成,都与docker-compose链接。 我希望所有事情都能够无缝地进行,无需人工干预(安全性不是问题),所以我希望通过挂载特定的文件以编程方式在启动时向用户添加默认的键/值对。

我一直在遇到这个问题,每当我尝试添加k / v对在启动使用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": "*" } } 

必须有某种方式可以暂停批量上传,直到我知道领事已经启动并正在运行。

我得到了一个类似的问题,我通过指定预期的Consul节点的数量(使用命令行参数-bootstrap-expect=5 )而不是简单的在单个节点上的-boostrap来解决我的问题( Bootstrap cannot be provided with an expected server count ) 。