Andor
04.04.2019
16:52:11
Ruslan
04.04.2019
17:23:25
Приветы. Почитал тут про entrypoint (последнюю переписку за несколько месяцев) и решил вопросов задать.
Хочу использовать образ postgres:9.6 и не отказываться от docker-compose.
Если сделать docker-compose up -d, очень быстро запускается ENTRYPOINT, отрабатывает и перезапускается уже как CMD, без ENTRYPOINT.
При этом, выглядит как грязный хак, что слово postgres из команды, используется и как первый параметр в ENTRYPOINT — не только как имя бинаря, но и как юзернейм. Наверное, это очень красиво, но очень ограничивает в возможностях использования.
Есть проблемы с вызовом ENTRYPOINT из docker-compose up -d, нет их в docker-compose run servicename.
За и против одного и второго:
+ первого в том, что можно определять имя контейнера, порты.
- первого в том, что вечный рестарт и ничего не работает (отдельная тема для обсуждения)
+ второго в том, что можно управлять вызовом ENTRYPOINT и делать свои чёрные дела, перед первым запуском postgres как процесса с PID 1
- второго в том, что отваливаются имена контейнеров, порты
Google
Ruslan
04.04.2019
17:24:03
Мои хотелки:
0. не пересобирать образ
1. подключить кастомизированный src/docker-entrypoint.sh:/docker-entrypoint.sh:ro вольюмом
2. docker-compose up -d и оно пошло вызывать ENTRYPOINT (главное — предсказуемо)
3. postgres запустился уже с теми данными, которые насоздавались в третьем пункте
И да, это всё для
/usr/lib/postgresql/9.6/bin/pg_basebackup -h "$SRC_HOST" -U "$SRC_USER" -P -v -D "$PGDATA" -w -P
George
04.04.2019
17:26:44
вся эта магия нафиг не нужна с кубернетесом - подготовили данные и поехали. Почему так странно сделано в докере штатном - он должен заинитить БД, если ее нет.
Т.е. образ как бы самодостаточный
и еще я рекомендую pg_probackup
Ruslan
04.04.2019
17:28:30
Что-то в этом есть. То есть, определить два сервиса?
1. для реплицирования с мастера, рестарт: никогда
2. для работы с этими данными, зависим от первого и не запускается, пока тот не отработает
так?
George
04.04.2019
17:28:54
типа того
я просто задачу изначальную не знал )
касательно порядка запуска в рамках докер-компоуза - это решается, но решается некрасиво
Ruslan
04.04.2019
17:29:50
Да, я недостаточно подробно описал кейс. Спасибо
и еще я рекомендую pg_probackup
Пока не могу так сделать. Надо ограничиться использованием штатного образа и просто правильно его готовить :(
Вопрос про то, как лучше сделать первый сервис:
1. переопределяю entrypoint: []
2. переопределяю command: ["/usr/lib/postgresql/9.6/bin/pg_basebackup", "-h", "${SRC_HOST}", "-U", "${SRC_USER}", "-P", "-v", "-D", "${PGDATA}", "-w", "-P"]
...
X. PROFIT!!!1!
Так?
George
04.04.2019
17:43:12
Пока не могу так сделать. Надо ограничиться использованием штатного образа и просто правильно его готовить :(
Вопрос про то, как лучше сделать первый сервис:
1. переопределяю entrypoint: []
2. переопределяю command: ["/usr/lib/postgresql/9.6/bin/pg_basebackup", "-h", "${SRC_HOST}", "-U", "${SRC_USER}", "-P", "-v", "-D", "${PGDATA}", "-w", "-P"]
...
X. PROFIT!!!1!
Так?
можно все что в п.2 загнать в entrypoint
Google
George
04.04.2019
17:43:28
как бы не особо потеря. Главное, чтобы каталог с данными существовал, а то будет подстава
т.е. запуск поверх уже существующей БД - не проблема. Проблема создать все необходимые каталоги
Ruslan
04.04.2019
17:45:36
тогда получится в момент запуска:
/usr/lib/postgresql/9.6/bin/pg_basebackup -h "$SRC_HOST" -U "$SRC_USER" -P -v -D "$PGDATA" -w -P postgres, вместо
/usr/lib/postgresql/9.6/bin/pg_basebackup -h "$SRC_HOST" -U "$SRC_USER" -P -v -D "$PGDATA" -w -P
George
04.04.2019
17:45:44
достаточно все написать в entrypoint, а cmd оставить пустым
я про это
Ruslan
04.04.2019
17:46:03
а, ок
сейчас поиграюсь, спасибо
ildar
04.04.2019
17:56:08
Ruslan
04.04.2019
19:12:41
В продолжение своего вышеописанного эпоса, родил пару новых вопросов:
1. можно ли использовать что-нибудь вроде order: stop-first, без использования swarm?
2. как использовать depends_on: db-prepare, если хочется не запустить другой сервис сразу после запуска некоего сервиса db-prepare, а дождаться того момента, когда тот отработает и остановится?
Цель: разделить подготовку БД и запуск контейнера с данными, которые подготовил другой контейнер.
Возможно, цель поставлена неверно.
Andor
04.04.2019
19:14:16
Ruslan
04.04.2019
19:15:11
А контейнер с БД запускается без враппера, просто командой postgres, PID=1
как быть?
спасибо, я не сразу понял, что healthcheck — ключевое слово
Andor
04.04.2019
19:30:16
Ruslan
04.04.2019
19:31:05
нет, просто я решил, что хелсчек надо делать перед запуском демона, в скрипте
Похоже, что я пробую какие-то несуществующие кейсы:
services:
init:
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
start_period: 40s
...
db:
volumes:
- pgdata:/var/lib/postgresql/data
depends_on:
init:
condition: service_unhealthy
...
А именно:
- не бывает service_unhealthy, а так хочется проверить, что оно stopped, или unhealthy
- общий volume pgdata и надо с ним работать только поочереди, а не надеяться на то, что битая БД будет поводом к останову второго контейнера.
Какие есть предложения, что мне почитать ещё?
Andor
04.04.2019
20:58:56
А чо надо-то?
Запуск постгреса не требует этой херни
Google
Ruslan
04.04.2019
21:19:15
Есть потребность выполнить предварительную репликацию с мастера.
Разделил на два контейнера, так как с одним ещё больше печалей
Andor
04.04.2019
21:22:05
Сделай чтобы один контейнер можно было запускать сколько угодно раз без слома чего-то
Ну или просто возьми готовый патрони
George
05.04.2019
05:19:15
я @Andorka рассказывал. Выбери интервал времени за которое миграция гарантированно отрабатывает. Это будет время опроса хелсчека. Далее в конце миграции делаешь && touch /tmp/flag && sleep 10000 и в хелсчеке test -f /tmp/flag
профит
но вообще натягивать это на докер-компоуз - то еще удовольствие
либо тебе нужен внешний оркестратор. В конце-концов, можешь проверять код возврата контейнера в баше
типа
#!/bin/bash
docker run my_migrations
# здесь проверяем код возврата, если ошибка - на выход
docker run -d postgres
Ruslan
05.04.2019
07:08:26
Ilia
05.04.2019
07:11:30
Andor
05.04.2019
07:12:04
берёшь готового оператора...
Ruslan
05.04.2019
07:15:59
делай наоборот
Если проверять healthy, то да - это работает, хотя и небезопасно - постгрес может в любой момент решить, что всё докачалось и начнёт портить данные, каким-либо способом
Идея нравится
Andor
05.04.2019
07:18:53
composer:
<<: *php-cli
working_dir: /var/www/nexus/lib
healthcheck:
test: test -f /tmp/.composer.done
interval: 2s
timeout: 1s
retries: 120
environment:
SLEEP_BEFORE_EXIT: '1'
entrypoint:
- bash
- -e
- -c
- >
rm -f /tmp/.composer.done;
case $$0 in
install)
composer "$$0" --no-interaction "$$@";
;;
*)
composer "$$0" "$$@"
;;
esac;
touch /tmp/.composer.done && ( [[ $$SLEEP_BEFORE_EXIT == 1 ]] && sleep 5 || true );
command:
- install
наслаждайся девопс-веем 2019 года
Ruslan
05.04.2019
07:21:54
Ой-вей, как говорится ?
Спасибо, попробую
Папідоха
05.04.2019
07:42:12
Привет, всем. У меня какая-то невероятная дичь. Есть nodejs програмка, что запускается в контейнере и принимает запроси на конкретном порту. Ей достаточно ресурсоав, она уже даже автоматизирована, но она засыпает и не могу понять почему
Google
Папідоха
05.04.2019
07:42:45
Тоесть если бомбить приложение запросами, то ему норм, хоть в 100 потоков
Но если его оставить без дела на несколько минут, то вернет 502-ю, а после нескольких обновлений страницы снова заведется
Вы с таким не сталкивались?
Andor
05.04.2019
07:45:15
У меня какая-то невероятная дичь. Есть nodejs програмкаможно не продолжать было
502 само приложение возвращает или реверс-прокси перед ним?
Папідоха
05.04.2019
07:45:53
nginx возвращает
Vlad
05.04.2019
07:46:02
о, блокчейн весит 300 гигов?
George
05.04.2019
08:21:05
Arczi
05.04.2019
08:25:04
Парни как сделать что бы после выполнение CMD в dockerfile контенер дальше жил ??
Andor
05.04.2019
08:25:36
никак
Viktor
05.04.2019
08:27:48
CMD [ cmd; tail -f /bin/bash ] как костыль
Andor
05.04.2019
08:28:10
sleep infinity
Arczi
05.04.2019
08:29:08
Andor
05.04.2019
08:29:33
что?
Denis 災 nobody
05.04.2019
08:29:34
если влили образы докера в хранилище, как их пускать через docker-compose?
(в приватную репу)
Andor
05.04.2019
08:29:46
так же как и для публичного реджистри
Denis 災 nobody
05.04.2019
08:30:00
я так понимаю, надо тогда писать другой докер-компоуз..
Google
Andor
05.04.2019
08:30:16
имя образа будет другое, очевидно
Denis 災 nobody
05.04.2019
08:30:44
docker tag kamailio:latest 1.1.1.1:5000/kamailio
docker push 1.1.1.1:5000/kamailio
Andor
05.04.2019
08:31:02
жесть
Denis 災 nobody
05.04.2019
08:31:06
что?
Andor
05.04.2019
08:31:13
2019 год на дворе, а они ip-адреса хардкодят
Arczi
05.04.2019
08:31:23
что?
502 bad request logi говорят что не может до fpm достучаться, убераю CMD с sleep infinity и все работает
Andor
05.04.2019
08:31:54
Denis 災 nobody
05.04.2019
08:32:01
сути не меняет
сейчас есть компоуз файл где запускается сборка из папки
kamailio:
build:
context: kamailio
dockerfile: Dockerfile
ports:
- "5080:5080"
Andor
05.04.2019
08:33:26
если добавишь туда image то при сборке компоуз сам будет вешать тег на имдж
останется только сделать push
Denis 災 nobody
05.04.2019
08:38:27
хм, спасибо