Как запустить сценарий оболочки сразу после Dockerfile 'CMD ["mysqld"]'? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть образ MariaDB, работающий в контейнере Docker, который должен обновлять свой корневой пароль при каждой инициализации по соображениям безопасности.Существует сервер хранилища, с которого мой контейнер получает новый пароль при каждой инициализации.После получения нового пароля мой скрипт должен быть запущен, чтобы войти в базу данных MariaDB и обновить пароль.Я испробовал несколько стратегий для запуска такого скрипта, как только база данных MariaDB будет запущена и запущена, но пока безуспешно.Я использую Dockerfile для создания моего расширенного образа MariaDB.В конце есть CMD ["mysqld"], который запускает сервис.Проблема в том, что мой скрипт должен быть запущен сразу после команды «CMD [« mysqld »]», поскольку именно эта команда инициализирует процесс MariaDB, а затем становится «Готов к подключению».

IsЕсть ли способ обойти эту ситуацию, чтобы запустить мой сценарий оболочки (["/foreground.sh"]) сразу после запуска и запуска сервиса MariaDB?Важно помнить, что после инициализации контейнера никакие человеческие манипуляции не допускаются.Поэтому каждое действие должно выполняться через сценарий оболочки, поскольку этот проект предназначен для производственной среды, откуда у меня нет доступа.

Соответствующая часть моего Dockerfile

VOLUME /var/lib/mysql
EXPOSE 3306
COPY docker-entrypoint.sh /
COPY foreground.sh /
RUN chmod +x /docker-entrypoint.sh /foreground.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["mysqld"] ["/foreground.sh"]

Соответствующая частьмоего "foreground.sh"

    mysql -u"root" -p"$ROOT_PASSWORD" <<MariaDB_INPUT
    UPDATE mysql.user SET authentication_string=PASSWORD("$MYSQL_ROOT_PASSWORD_NEW_VAULT") WHERE USER="root";
    UPDATE mysql.user SET authentication_string=PASSWORD("$MYSQL_PASSWORD_NEW_VAULT") WHERE USER="user";
    UPDATE mysql.user SET plugin="mysql_native_password";
    FLUSH PRIVILEGES;
    quit

MariaDB_INPUT

1 Ответ

1 голос
/ 16 июня 2019

Если вы используете официальное изображение для MariaDB , вы можете просто добавить свой скрипт в папку /docker-entrypoint-initdb.d/*.

Взгляните на скрипт docker-entrypoint.sh:

  • Строка 110 - скрипт ожидает запуска экземпляра и приема запросов.
  • Строка 178 - скрипт запускает настроенные скрипты из каталога /docker-entrypoint-initdb.d/*

Таким образом, вы можете просто добавить свой скрипт для смены пароля в нужное место, и он запустится после того, как экземпляр будет готов для обновления пароля.Вам не нужно изменять значения CMD или ENTRYPOINT.

...