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用户添加到容器
/etc/passwd
文件中,并对该文件运行chmod
,但是甚至没有从jenkinsfile
进行这两个操作的权限。 使用此配置,我应该是root用户。但是,如果我不使用
Error: must run as root
,我会看到sudo
;如果我不使用sudo,我会看到no tty present and no askpass program specified
。是否有正确的方法来处理这种情况?理想地来自
jenkinsfile
;如果可能,我想避免创建其他Dockerfile
,因为这将进一步区分测试和生产。 #1 楼
因此,在聊天中进行调试会话后,需要执行的操作是让运行jenkins的用户能够在Docker主机上无密码登录。ubuntu上的典型sudoers文件可能位于
sudo docker
中。jenkins_user ALL=(ALL) NOPASSWD:ALL
请注意,允许
/etc/sudoers.d/jenkins
以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运行的方式赋予了容器自身所有的权限。 />
已用掉的有用资源:
Jenkins docker插件自述文件
如何在Linux上设置无密码
jenkins_user
?#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")
}
}
}
}
评论
介意分享您的jenkinsfile和unit.sh吗?听起来主要是在这一点上猜测...这是一个棘手的问题,试图让人们解决您的作业。真的有詹金斯论坛这类事情。确实应该以一种在Google搜索中可以找到类似问题的形式来提出您的问题,该问题对您本人以外的其他人很有用,对本网站来说是一个好问题。
我已经在谷歌上搜索了好几天,并且拖了Jenkins文档。我尚未找到解决方案。如果我找不到想要的答案的术语,请告诉我。我已经更新了问题,以使问题更清楚,但我不同意这是“棘手的”或“作业”。
我用一个最小的例子更新了这个问题
也许这会有所帮助:wiki.jenkins-ci.org/display/JENKINS/Docker+Plugin(我认为当您不是root用户时,-u root不起作用,它会更改用户名而不是userid)。您必须与允许sudo无密码的jenkins用户一起准备图像。