автоматически загружать пакет при перезагрузке модуля - PullRequest
0 голосов
/ 05 июля 2018

Я снова и снова загружаю и устанавливаю пакет каждый раз, когда модуль перезапускается, так как я могу его автоматизировать. Я хотел, чтобы модуль автоматически устанавливал или загружал пакет после его перезапуска. Как я могу это сделать в Kubernetes?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Пакет должен быть полным - он не должен загружать и устанавливать пакет. По сути, вы пытаетесь выполнить «шаг сборки» во время запуска модуля, это почти наверняка анти-паттерн.

Если используемый вами образ не содержит пакета, вы должны создать свой собственный образ и развернуть его в реестре докеров или найти другой образ докера, содержащий необходимый пакет.

ericstaples проделали хорошую работу, объяснив, как свернуть свой собственный образ докера и заставить его создать репозиторий Docker.

Если вы отредактируете свой вопрос и предоставите тег репозитория изображения, который вы используете в настоящее время, а также пакет, который вы хотите установить, вы можете получить лучшие ответы.

0 голосов
/ 05 июля 2018

Вариант 1 (лучшая практика):

Если вы хотите, чтобы при загрузке пакет загружался и устанавливался в контейнере внутри модуля, вы должны добавить эти инструкции по загрузке и установке в Dockerfile, используя директиву RUN.

Если вы используете общедоступное изображение, а не свое собственное пользовательское изображение, то вам нужно будет создать Dockerfile и использовать общедоступное изображение в качестве базового изображения для создания и передачи своего собственного пользовательского изображения Docker в хранилище изображений. Вы делаете это, добавляя директиву FROM в качестве первой строки Dockerfile.

Существует множество учебных пособий о том, как создавать образы с помощью Dockerfiles и отправлять их в репозиторий для использования Kubernetes. Вот официальная документация от Docker, которая объясняет вышеупомянутые директивы и все остальное, что вам нужно знать для создания Dockerfiles, встраивания их в образы Docker и отправки их в репозиторий изображений, такой как Docker Hub.

Короче говоря, вы получите Dockerfile, который выглядит примерно так, и добавляет инструкции по загрузке и установке пакета в базовый образ:

FROM <base image (i.e. the image you’re currently using)>

RUN <download command>
RUN <install command>

В связанной документации рассказывается о том, как создать и перенести образ Docker в репозиторий, а затем нужно просто обновить поле image в своем манифесте Pod.

Теперь при каждом перезапуске вашего Pod уже будет установлен пакет.

Вариант 2 (анти-шаблон, не рекомендуется):

Внимание: я включаю эту опцию, потому что OP не хочет использовать вариант 1, поэтому я включаю одну возможную теоретическую альтернативу.

Вы могли бы использовать контейнер init для выполнения этого. Контейнеру init потребуется загрузить и установить пакет для контейнера приложения и поместить его в смонтированный emptyDir том , общий для контейнера init и контейнера приложения. Эта работа будет выполнена с использованием свойства command в контейнере init.

После запуска контейнера init ваш контейнер приложения может получить доступ к пакету через подключенный общий том emptyDir.

Подробнее об обмене данными между контейнерами .

Есть несколько причин, по которым я могу придумать, почему это анти-паттерн:

  1. Замедляет время запуска Pod.

  2. Ваш том emptyDir является изменяемым, и если вы каким-либо образом удалите или повредите пакет, и ваш контейнер приложения (не Pod) выйдет из строя, ваш Pod будет аварийно завершать цикл, так как ваш контейнер init работает только при перезапусках Pod, а не в контейнере перезагружается.

  3. Это излишне усложняет ваш манифест Pod.

...