【发布时间】:2017-12-01 23:18:15
【问题描述】:
我正在使用声明性管道语法在 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
...
dockerfile 代理有一个additionalBuildArgs 属性,所以我可以读取主机中 jenkins 用户的用户 ID 和组 ID,并将它们作为构建参数发送,但我现在遇到的问题是,似乎有在指定代理之前,无法在声明性管道中执行这些命令。我希望我的 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 {
...
}
}
stage('Bar') {
steps {
...
}
}
stage('Baz') {
steps {
..
}
}
...
}
}
我有什么方法可以做到这一点?我也尝试将管道指令包装在节点内,但管道需要位于文件的根目录。
【问题讨论】:
-
我觉得这应该用某种标准模板引擎来完成,比如 jinja2。
标签: docker jenkins dockerfile