我正在尝试在docker容器上旋转Consul服务器,并将其用作SpringBoot云应用程序的配置服务器。为此,我希望在Consul中有一些预先配置的数据(键值对)。
我在docker-compose.yml中的当前配置是:
consul:
image: "progrium/consul:latest"
container_name: "consul"
ports:
- '9330:8300'
- '9400:8400'
- '9500:8500'
- '9600:53'
command: "-server -bootstrap -ui-dir /ui"
有没有办法预先填充键值对?
答案 0 :(得分:0)
Compose没有内置概念的“任务”,但您可以在项目中使用多个撰写文件进行设置。 docker-compose-init.yml
可以定义任务,而不是长期运行的服务,但您需要自己管理编排。我放了example on my consul demo。
docker-compose up -d
docker-compose -f docker-compose-init.yml run consul_init
您可以添加图片构建RUN
步骤来添加数据。这里的复杂功能是以与往常相同的方式运行服务器,但在后台运行,并在一个RUN
步骤中添加数据。
FROM progrium/consul:latest
RUN set -uex; \
consul agent -server --bootstrap -data-dir /consul/data & \
let "timeout = $(date +%s) + 15"; \
while ! curl -f -s http://localhost:8500/v1/status/leader | grep "[0-9]:[0-9]"; do\
if [ $(date +%s) -gt $timeout ]; then echo "timeout"; exit 1; fi; \
sleep 1; \
done; \
consul kv put somekey somevalue;
某些数据库向映像添加脚本以在启动时填充数据。这通常是因为用户可以通过在运行时注入的环境变量来控制设置,例如mysql / postgres / mongo。
FROM progrium/consul:latest
ENTRYPOINT my-entrypoint.sh
然后你的脚本启动服务器,设置数据,然后在最后继续,就像之前的图像一样。
答案 1 :(得分:0)
我无法获得为我工作的公认解决方案。我猜这是因为它在构建时启动的存根 consul 在运行时以某种方式被覆盖。
使用已接受的答案作为起点,我添加了一个加载程序脚本,该脚本在每次容器启动时启动。下面的 Dockerfile
向 Consul 入口点脚本添加了一个“垫片”(请参阅 RUN sed
)。
使用:
Dockerfile
init_kv/
旁边添加一个 Dockerfile
目录init_kv/
目录下添加json文件,例如yourkey.json
yourkey
docker build
/docker run
/docker-compose up
等值得注意的是:
yourkey
已经存在,则不会重新加载Dockerfile
# pull official base image
FROM consul
# key-value shim loader
# you can override this loader using an empty docker volume:
ENV INIT_CONSUL_KV_DIR=/var/local/init_consul_kv.d
RUN mkdir -p $INIT_CONSUL_KV_DIR
COPY kv_loader.sh /usr/local/bin/
RUN sed -ie 's|^\(set .*\)|\1\n/usr/local/bin/kv_loader.sh \&|' /usr/local/bin/docker-entrypoint.sh
COPY init_kv/ $INIT_CONSUL_KV_DIR/
kv_loader.sh
#!/bin/sh
# wait until consul is up
# then inject all key/value files as found in the init directory
set -ue
let "timeout = $(date +%s) + 15"
echo "kv_loader waiting for consul"
while ! curl -f -s http://localhost:8500/v1/status/leader | grep "[0-9]:[0-9]"; do
if [ $(date +%s) -gt $timeout ]; then echo "kv_loader timeout"; exit 1; fi
sleep 1
echo "kv_loader still waiting"
done
echo "kv_loader get/put from $INIT_CONSUL_KV_DIR"
cd $INIT_CONSUL_KV_DIR
for json_file in $(ls *.json); do
key=$(echo $json_file | sed -e 's/.json$//')
echo "kv_loader loading $key from $json_file"
consul kv get $key >/dev/null && echo "kv_loader $key already loaded" || consul kv put $key @$json_file
done