Дженкинс: проблема с разрешением при использовании Docker в качестве среды сборки

11

Я установил Jenkins на машине с Ubuntu 16.04. Сам Дженкинс не запускается в контейнере. То, что я хочу сделать, это просто позвонить, yarn installиспользуя изображение узла. Итак, вот мой Jenkinsfile:

pipeline {
    agent any
    stages {
        stage('install node modules...') {
            agent { docker 'node' }
            steps {
                sh 'cd /path/to/package.json; yarn install'
            }
        }
    }
}

Довольно просто, правда?

Пользователь / группа jenkins есть 112:116, а uid контейнера узла 1000, следовательно, процесс пряжи (который запускается как пользователь узла 1000) не может делать свои вещи, например mkdir /.config.

Я попытался раскрутить контейнер узла, передавая аргумент -u 1000, он столкнулся с проблемами прав доступа при попытке создания надежных каталогов.

Похоже, тот или иной вид проблемы, как я могу обойти это?

Дженкинс журналы:

Ниже, где сборка начинается и терпит неудачу.

[Pipeline] sh
[Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2] Running shell script
+ docker inspect -f . node
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 112:116 -w /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2 -v /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2:/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2:rw,z -v /var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2@tmp:/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** --entrypoint cat node
[Pipeline] {
[Pipeline] sh
[Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2] Running shell script
+ cd /path/to/package.json
+ yarn install
yarn install v0.24.6
error An unexpected error occurred: "EACCES: permission denied, mkdir '/.config'".
info If you think this is a bug, please open a bug report with the information provided in "/var/lib/jenkins/workspace/Pipeline_Test_Jenkins_test-4JTFYMX7KSJY6ZH44VINNGEB7WH2D2HWYZN5ABF6O32O2HBQJYXQ@2/<path>/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
[Pipeline] }
$ docker stop --time=1 c1147934ea689f71a449e486282db03338b12182368def31bdf8e8cf179ab46a
$ docker rm -f c1147934ea689f71a449e486282db03338b12182368def31bdf8e8cf179ab46a
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE
Майкл
источник
Пожалуйста, добавьте журналы
030
Приложил логи. Я также попытался запустить Jenkins, используя его официальный образ докера, который отлично работает, потому что пользователь jenkins в этом образе докера равен 1000, что такое же uid, как и у пользователя узла в образе узла.
Майкл,
Selinux включен и работает?
Джеймс Шиви
@JamesShewey Не уверен. Я просто использую экземпляр Ubuntu AMI ec2.
Майкл
Я полагаю, что они отключают это, но проверьте с "sestatus". Если он включен, попробуйте выключить его.
Джеймс Шиви

Ответы:

8

У меня была такая же проблема с узлом. Дело в том, что файлы в контейнере принадлежат «root: root». Попробуйте добавить аргументы docker -u root:root:

docker { 
    image 'node:8'
    args '-u root:root'
}
blurrcat
источник
Решение сработало и для меня. Почему этого нет в документации Jenkins? (моя проблема была с простой pip installкомандой в результате Could not install packages due to an EnvironmentError: [Errno 13] Permission denied, упоминая его здесь , чтобы помочь людям , которые ищут , что даже с помощью. virtualenvили pip install --userне исправить эту проблему для меня)
Rabarberski
3

У меня сегодня была похожая проблема, хотя и с другим изображением.

docker {
 image 'node:8'
 args '--tmpfs /.config'
}

Ссылка: https://docs.docker.com/storage/tmpfs/ Таким образом, вы не должны беспокоиться о каких-либо утечках безопасности или файлах, которые присутствуют после разрушения контейнера внутри jenkins.

Anvesh
источник
3

buildEnv.inside("-u 0") {}решил мою проблему. Но тогда рабочее пространство будет содержать каталог и файлы, принадлежащие пользователю root, которые пользователь Jenkins не сможет удалить при следующем запуске при очистке рабочего пространства, поэтому я добавил его sh "sudo chown jenkins: -R \$PWD/" в начале конвейера.

AhmedDrira
источник
Я использовал аналогичный подход, но в конце запустил 'sh "chmod -R a + w \ $ PWD" в качестве шага "Очистка" конвейера, а не в начале. Пользователь Jenkins не был определен в моем контейнере, и sudo не был доступен. Я мог бы тоже удалить файлы, но подумал, что было бы лучше оставить их для расследования, если что-то пойдет не так.
Оливье Будри