Как контейнер OpenShift может узнать свой идентификатор изображения? - PullRequest
0 голосов
/ 05 октября 2018

Я хотел бы добавить опцию конфигурации в собственный, основанный на PostgreSQL образ Docker для OpenShift 3.9 в форме переменной шаблона INITDB.Образ предоставляет базу данных, которая поддерживается постоянным хранилищем, и с этого момента базу данных следует инициализировать, только когда эта переменная (флаг) установлена.

Образ построен с использованием стратегии сборки OpenShift Docker и PostgreSQL * 1004.* вызывается в Dockerfile 'ENTRYPOINT сценарии: поэтому он выполняется при каждом запуске контейнера.Однако я хочу, чтобы установленный флаг имел эффект только при первом запуске помеченного контейнера.В противном случае может произойти то, что база данных инициализируется при первом запуске контейнера (как и должно быть), но также становится повторно инициализированной при перезапуске контейнера, например, из-за миграции на другой узел (это нежелательно).

Таким образом, я, вероятно, нуждаюсь в некоторой логике, посредством которой скрипт сохраняет идентификатор изображения контейнера в файле также в постоянном хранилище с логикой, такой, что он вызывает initdb, только если установлен флаг и , файл несуществует или содержит другой идентификатор изображения.Так что, возможно, что-то в этом роде примерно так:

file=/mnt/pgdata/image_id
if [ -n "$INITDB" ] && [ $(cat $file) != $image_id]; then
  initdb ...
  echo $image_id > $file
fi

Итак, мой вопрос заключается в следующем: как работающий контейнер может узнать идентификатор своего изображения?Есть ли готовая переменная окружения (например, OPENSHIFT_... - пока я не нашел ни одной) или она должна была пройти через API?Второй вариант кажется осуществимым, потому что oc describe pods содержит список «Идентификатор изображения» (и из-за oc explain pod.spec.containers.image).Но нужно ли / желательно ли это, и если да, нужно ли предоставлять явные учетные данные или по умолчанию контейнеры имеют соответствующие учетные данные?

Мне также было бы интересно узнать, как собственный / "официальный" образ PostgreSQL в OpenShiftпредоставляет такую ​​функциональность, но пока не нашел правильный исходный код.

1 Ответ

0 голосов
/ 08 октября 2018

Предложение в отношении hostname, полученное в одном из комментариев, было уместным.Следующий фрагмент кода теперь служит по назначению:

file=/mnt/pgdata/hostname
if [ -n \"$INITDB\" ] && [ \"$(cat $file)\" != $(hostname) ]; then
  initdb ...
  echo $(hostname) > $file
fi
...