Как задать значения consul kv при запуске в докере?

Хочу сделать так, чтобы в докере поднимался consul с уже заполненными некоторыми значениями в key-value store.
Насколько понимаю, единственный способ это сделать - это запустить consul, затем добавить через cli или http нужные значения. Сделал такой Dockerfile
FROM consul:latest
COPY kv-values.sh /kv-values.sh
RUN chmod 755 /kv-values.sh && sh -c ./kv-values.sh
EXPOSE 8300 8400 8500 8600
ENTRYPOINT ["/kv-values.sh"]

Но так докер ругается:
sh: ./kv-values.sh: not found

Содержимое скрипта:
spoiler
!/bin/bash

set -uex; \
consul agent -server --bootstrap -data-dir ./consul/data & \
let "timeout = $(date +%s) + 15"; \
while ! curl -f -s 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 sql/config/addr db; \
consul kv put sql/config/port 1433;
...

Если содержимое скрипта вставить в Dockerfile в RUN, то команды проходят и сборка завершается успешно, но контейнер не запускается no such container). Подозреваю, что это из-за того, что пишу неправильный ENTRYPOINT ["consul"].

В общем, буду благодарен за советы, как это правильно реализовать и в чем мои ошибки
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
@wargych Автор вопроса
Нашел 3 пути.
1. Первый и правильный с точки зрения назначения консула описан тут:
поднимаем кластер для использования в качестве discovery-сервиса и потом заполняем данными из клиента.
https://github.com/deployable/docker-consul
2. Способ на котором мы пока остановились - храним данные в volume. Есть проблемы с правами при разворачивании проекта в новом окружении.
3. Костыльный и неправильный , но рабочий способ - подставить в качестве entrypoint свой скрипт, который запускает 2 скрипта - один в фоновом режиме пингует поднятие консула и заполняет его данными, второй собственно поднимает сам консул.
Примерное содержимое файлов:
Docker-compose.yml
version: '3.2'

services:
consul:
build:
context: ./
dockerfile: Dockerfile
ports:
- 8500:8500
entrypoint: sh -c "cd /confrun/ && sh kvconf.sh"

Dockerfile

FROM consul:latest
COPY ./confrun/ /confrun/
RUN chmod 755 -R /confrun/
EXPOSE 8300 8400 8500 8600
ENTRYPOINT sh -c "cd /confrun/ && sh kvconf.sh"

kvconf.sh

#!/usr/bin/dumb-init /bin/sh
sh ./subscriber.sh &
sh ./runner.sh

subscriber.sh

#!/bin/bash
let "timeout = $(date +%s) + 15"; \
while ! curl -f -s 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 sql/config/addr db;
...все нужные команды. Чтобы избежать повторного заполнения при старте, нужно дописать consul get с проверкой на значение...

runner.sh

#!/bin/bash
consul agent -server -ui -bind 0.0.0.0 -client 0.0.0.0 -bootstrap-expect 1 -data-dir /consul/data -config-dir /consul/config

Ну и в принципе вместо runner.sh будет правильнее подставить стандартный скрипт консула entrypoint.sh.
До конца этот путь не довел, т.к. все-таки слишком костыльно на мой взгляд, но все запускалось и значения добавлялись.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Чисто по ошибке докера:
COPY kv-values.sh /kv-values.sh
RUN chmod 755 /kv-values.sh && sh -c ./kv-values.sh


Вы скрипт скопировали в корень, chmod для него сделали тоже в корне, а запускаете из текущей директории? в команде sh -c ./kv-values.sh точку уберите.
Ну и вдовесок ко всему - а в consul:latest вообще bash есть? Или только sh?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы