在Jenkins Pipeline中运行Docker时正确的权限设置是什么?


11

我正在尝试建立一个新的jenkins管道,以测试对我们代码的新请求请求。我在ubuntu:14.04图像上使用docker 来模拟我们的生产环境。

这是一个最小的工作示例:

#jenkinsfile
stage('Checkout and provision'){
docker.image('ubuntu:14.04').withRun('-u root'){
    checkout scm
    sh 'chmod -R 770 ./'
    sh './init-script.sh'
    }
}

 #init-script.sh
 sudo add-apt-repository ppa:ondrej/php
 sudo apt-get update -y
 sudo apt-get dist-upgrade -y
 sudo apt-get install \
    apache2 \
    php \
    php-mysql \
    php-xml \
    libapache2-mod-auth-mysql \
    libapache2-mod-php \
    php5-curl \
    zip \
    htop \
    supervisor \
    mailutils \
    git \
    build-essential -y
 sudo apt-get autoremove -y

/etc/sudoers容器的文件如下:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults:jenkins !requiretty

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

jenkins ALL=(ALL:ALL) NOPASSWD:ALL

我遇到的问题是docker没有像我以前那样以root身份运行,而是从主机保留了jenkins用户的用户ID。这使得很难进行sudo。

我尝试将jenkins用户添加到container /etc/passwd文件并chmod针对该文件运行,但是甚至没有权限从中执行任何一个操作jenkinsfile

使用此配置,我应该是root用户。但是,我要么看Error: must run as root我是否不使用,要么看sudosudo:no tty present and no askpass program specified如果我使用。

有没有正确的方法来处理这种情况?理想地来自jenkinsfile; 我想避免创建更多(Dockerfile如果可能的话),因为这将进一步区分测试和生产。


介意分享您的jenkinsfile和unit.sh吗?听起来主要是在这一点上猜测
Tensibai'4

这是一个棘手的问题,试图让人们解决您的作业。确实有针对此类事情的詹金斯论坛。遇到类似问题时,应该以一种可以在google搜索中找到的形式来提出您的问题,对您本人以外的其他人有用的问题对本网站来说是一个好问题。
Jiri Klouda'4

我已经在谷歌上搜索了好几天,并且拖了Jenkins文档。我尚未找到解决方案。如果我缺少寻找所需答案的术语,请告诉我。我已经更新了问题,以使问题更清楚,但我不同意这是“棘手的”或“作业”。
tobassist

我用一个最小的示例更新了这个问题
tobassist

1
也许这会有所帮助:wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin(我认为当您不是root用户时,-u root不起作用,它会更改用户名而不是userid)。您必须与允许使用sudo无密码的jenkins用户准备图像。
Tensibai'4

Answers:


12

因此,在聊天中进行调试会话后,需要做的是允许运行jenkins的用户能够在Docker sudo docker主机上无密码。

ubuntu上的典型sudoers文件可能位于 /etc/sudoers.d/jenkins

jenkins_user ALL=(ALL) NOPASSWD:ALL

请注意,允许jenkins_user以root身份运行而无需输入任何命令,更好的文件应为:

jenkins_user ALL=(ALL) NOPASSWD:/full/path/to/docker
jenkins_user ALL=(ALL) NOPASSWD:<other needed command to be run as root>

这将允许以root用户身份启动容器,因此,它通过以uid 0运行来赋予容器自身内的所有权限。

预留的有用资源:


2

以root身份运行Docker实际上是一个坏主意。您应该做的是将Jenkins用户添加到Docker组。sudo usermod -aG docker jenkins。这样可以避免不必要的安全漏洞,并使Jenkins能够完成与Docker所需的所有工作,包括在容器内以root身份运行。我使用自己的示例定期进行构建:

stage ('Build Docker Image') {
  steps {
    script {
      // Build the Docker image for compiling
      dockerImage = docker.build("myapp:v1")
    }
  }
}
stage ('Run UnitTests') {
  steps {
    script {
      dockerImage.inside("-itu root") {
        sh(script: "nosetests app-test.py --verbose")
      }
    }
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.