Здесь много проблем, но самым большим является то, что вам нужно создавать свои изображения с помощью необходимых вам инструментов, а не устанавливать внутри работающего контейнера. Как упоминает techtrainer, изображения неизменяемы и не меняются (по крайней мере, из вашего запущенного контейнера), а контейнеры являются одноразовыми (поэтому любые изменения, которые вы делаете внутри них, теряются при их перезапуске, если ваши данные не хранятся вне контейнера в томе).
Я не согласен с techtrainer о внесении изменений в контейнер и присвоении им изображения с помощью docker commit
. Это будет работать, но это ручной метод, который очень подвержен ошибкам и не просто воспроизводится. Вместо этого вы должны использовать файл Docker и использовать docker build
. Вы можете либо изменить изображение jenkins, которое вы используете, либо напрямую изменив его Dockerfile, либо создать дочернее изображение, которое равно FROM jenkins:latest
.
При изменении этого изображения изображение Jenkins настроено на запуск как пользовательский «jenkins», поэтому вам нужно переключиться на root, чтобы выполнить установки приложений. Приложение «sudo» не входит в большинство изображений, но внешнее к контейнеру, вы можете запускать команды докеров в качестве любого пользователя. Из кли, это так же просто, как docker run -u root ...
. И внутри вашего Dockerfile вам нужно всего лишь USER root
наверху, а затем USER jenkins
в конце.
Последний совет состоит в том, чтобы не запускать ваши сборки непосредственно на контейнере jenkins, а запускать агенты с необходимыми инструментами сборки, которые вы можете обновить независимо от контейнера jenkins. Он намного более гибкий, позволяет вам иметь несколько сред с только инструментами, необходимыми для этой среды, и если вы масштабируете это, вы можете использовать плагин для разворачивания агентов по требованию, чтобы вы могли использовать сотни возможных агентов и только одновременно работать с несколькими из них.