亲爱的Stackoverflow社区,
我正在尝试使用docker镜像作为构建过程的容器来设置Jenkins CI管道.我正在定义一个Jenkinsfile以将构建管道作为代码.我正在做这样的事情:
node {
docker.withRegistry('http://my.registry.com', 'docker-credentials') {
def buildimage = docker.image('buildimage:latest');
buildimage.pull();
buildimage.inside("")
{
stage('Checkout sources') {
git url: '...', credentialsId: '...'
}
stage('Run Build and Publish') {
sh "..."
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我绊倒了Docker管道插件的奇怪行为.在构建输出中,我可以看到Image.inside(...)命令用a触发容器
docker run -t -d -u 1000:1000 ...
Run Code Online (Sandbox Code Playgroud)
这使我的构建失败,因为Dockerfile中定义的用户没有UID 1000 ......实际上是另一个用户.我甚至尝试指定应该在Jenkinsfile中使用哪个用户
node {
docker.withRegistry('http://my.registry.com', 'docker-credentials') {
def buildimage = docker.image('buildimage:latest');
buildimage.pull();
buildimage.inside("-u otheruser:othergroup")
{
stage('Checkout sources') {
git url: '...', credentialsId: '...'
}
stage('Run Build and Publish') {
sh "..."
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这会导致生成的docker …
我正在使用声明性管道语法在docker容器中执行一些CI工作.
我注意到Jenkins的Docker插件使用主机中jenkins用户的用户ID和组ID运行一个容器(即如果jenkins用户有用户ID 100和组ID 111,它将运行管道创建一个容器,命令docker run -u 100:111 ...).
我遇到了一些问题,因为容器将与非现有用户一起运行(特别是我遇到了一些没有主目录的用户的问题).所以我想创建一个Dockerfile,它将接收用户id和组ID作为构建参数,并在容器内创建一个合适的jenkins用户.Dockerfile看起来像这样:
FROM ubuntu:trusty
ARG user_id
ARG group_id
# Add jenkins user
RUN groupadd -g ${group_id} jenkins
RUN useradd jenkins -u ${user_id} -g jenkins --shell /bin/bash --create-home
USER jenkins
...
Run Code Online (Sandbox Code Playgroud)
dockerfile代理有一个additionalBuildArgs属性,所以我可以读取主机中jenkins用户的用户ID和组ID,并将它们作为构建aguments发送,但我现在遇到的问题似乎是没有办法执行这些命令在指定代理之前的声明性管道中.我希望我的Jenkinsfile是这样的:
// THIS WON'T WORK
def user_id = sh(returnStdout: true, script: 'id -u').trim()
def group_id = sh(returnStdout: true, script: 'id -g').trim()
pipeline {
agent {
dockerfile {
additionalBuildArgs "--build-arg user_id=${user_id} --build-arg group_id=${group_id}"
}
}
stages {
stage('Foo') {
steps …Run Code Online (Sandbox Code Playgroud)