Вопрос:

Jenkinsfile: отказано в разрешении при запуске sh step в контейнере Docker

shell docker jenkins groovy jenkins-pipeline

6351 просмотра

1 ответ

2917 Репутация автора

У меня проблемы с запуском простого Jenkinsfile- например

pipeline {
    agent { label 'ssh-slave' } 
    stages {
        stage('Shell Test') {
            steps {
                sh 'echo "Hello World"'
            }
        }
    }
}

Лог-файлы Jenkins на главном сервере показывают, что контейнер был успешно запущен, но задание на сборку завершается с сообщением типа

sh: 1: /home/jenkins/workspace/pipeline@tmp/durable-34c21b81/script.sh: Permission denied

Вот некоторые дополнительные вещи, которые мы настроили / выяснили:

  1. Мы запускаем агент на виртуальной машине с RHEL

  2. Мы используем плагин Docker для Jenkins для запуска / управления контейнерами на отдельном агенте Jenkins

  3. Мы раскручиваем контейнер Docker, используя Connect with sshметод из плагина Jenkins, и используем образ Docker jenkinsci / ssh-slave

  4. Jenkins использует rootпользователя в контейнере Docker (по крайней мере все файлы внутри /home/jenkins/...него создаются как root

  5. Когда мы добавляем sleepшаг в конвейер и docker exec...в работающий контейнер, мы не можем выполнить простой сценарий оболочки от имени пользователя root, если мы пытаемся запустить его с помощью ./script.sh(даже если мы установили правильный режим файла с помощью chmod +x script.shbefore) - мы также получаем sh: 1: permission denied. Но мы можем запустить скрипт, если мы используемsh script.sh

  6. У rootпользователя в контейнере Docker есть bash- тогда как Jenkins пытается запустить скрипт с sh.

  7. Ошибка возникает независимо от того, проверяем ли мы run privilegedфлаг в конфигурации шаблона плагина Docker или нет

Вещи, которые мы уже пробовали, но не работали

  1. Изменение имени rootпользователя в контейнере Docker на/bin/sh

  2. Обеспечение Шебанга на shшаг, а ля

    sh '' '#! / bin / sh
    эхо "привет мир"
    «»»
    

  3. Установка для исполнителя оболочки /bin/shв глобальной конфигурации Jenkins

  4. Изменение Dockerfileобраза Docker ssh-slave таким образом, что сценарий ENTRYPOINTне запускается bash, а выполняется /bin/shв конце

Любая помощь приветствуется!

Автор: Michael Lihs Источник Размещён: 08.11.2017 11:27

Ответы (1)


1 плюс

2917 Репутация автора

Решение

Проблема заключалась в том, что /home/jenkinsв контейнере было установлено noexec:

$ mount
/dev/mapper/rhel-var on /home/jenkins type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)

Основная проблема заключалась в том, что /varна базовом хосте был смонтирован файл noexec( /varгде находятся все файлы контейнера ...):

$ mount
/dev/mapper/rhel-var on /var type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)

Таким образом, решение этой проблемы состояло в том, чтобы монтировать /varкак исполняемый на хосте через

sudo mount -o remount,exec /var

это решило проблему для нас.

Автор: Michael Lihs Размещён: 09.11.2017 10:31
Вопросы из категории :
32x32