私の開発環境は、1 つのコンテナー内のローカル consul サーバーと、別のコンテナー内のアプリケーション (consul-template が実行されている) で構成され、すべて docker-compose にリンクされています。すべてがシームレスに起動し、開発に手動で介入する必要がない (セキュリティは問題ではありません) ため、特定のファイルをマウントすることにより、起動時にプログラムでデフォルトのキーと値のペアを consul に追加したいと考えています。
API を使用して起動時に k/v ペアを consul に追加しようとすると、常にエラーで失敗するというこの問題に遭遇し続けます2016/06/03 21:10:15 [ERR] http: Request PUT /v1/kv/app/secret_key, error: No cluster leader from=[::1]:58888
。領事にリーダーを選出するのに十分な時間を与えて、事前にスリープコマンドを追加すると、機能します。しかし、これを同期的に行うためのより良い方法があるはずですよね? 特に、クラスタ内にノードが 1 つしかない場合はなおさらです。
これは私がこれまでに持っているものです。
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 が稼働していることを確認するまで、一括アップロードを一時停止できる方法が必要です。