Вариант 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
.
Подробнее об обмене данными между контейнерами .
Есть несколько причин, по которым я могу придумать, почему это анти-паттерн:
Замедляет время запуска Pod.
Ваш том emptyDir
является изменяемым, и если вы каким-либо образом удалите или повредите пакет, и ваш контейнер приложения (не Pod) выйдет из строя, ваш Pod будет аварийно завершать цикл, так как ваш контейнер init работает только при перезапусках Pod, а не в контейнере перезагружается.
Это излишне усложняет ваш манифест Pod.