2016-09-11 6 views
0

Я совершенно новый на докере, но у меня возникла проблема, я понятия не имею, как ее решить.Не удается установить внутри докер-контейнера

У меня есть изображение jenkins (докер), и все в порядке. Несколько дней назад я создал задание, поэтому каждый раз, когда выполняется запрос на растяжение, я могу запускать тесты nodejs. одним из шагов построения задания является запуск npm install. И работа постоянно неудачу с этой ошибкой:

tar (child): bzip2: Cannot exec: No such file or directory

Так, я знаю, что я должен установить bzip2 внутри контейнера Дженкинс, но как я могу это сделать? Я уже пытался запустить docker run jenkins bash -c "sudo apt-get bzip2", но я получил: bash: sudo: command not found.

Сказанное, как я могу это сделать?

Заранее спасибо.

ответ

0

Ответ на это лежит внутри философии контейнеров dcoker. Контейнеры-докеры/должны быть неизменными. Итак, вот что вы можете попытаться исправить эту проблему.

  1. Относитесь к базовому изображению i.e, jenkins в качестве отправной точки.
  2. войдите на это базовое изображение и установите bzip2.
  3. зафиксировать эти изменения, и это должно привести к новому изображению.
  4. Теперь используйте изображение выше с шага 3 для установки любого другого пакета, такого как npm.
  5. Теперь зафиксируйте изображение выше.

Примечание: Чтобы выполнять команды с большим контролем, я всегда предпочитаю использовать что-то вроде этого;

докер Exec -это Дженкинс Баш

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

1

Здесь много проблем, но самым большим является то, что вам нужно создавать свои изображения с помощью необходимых вам инструментов, а не устанавливать внутри работающего контейнера. Как упоминает 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. Он намного более гибкий, позволяет вам иметь несколько сред с только инструментами, необходимыми для этой среды, и если вы масштабируете это, вы можете использовать плагин для разворачивания агентов по требованию, чтобы вы могли использовать сотни возможных агентов и только одновременно работать с несколькими из них.

Смежные вопросы