尊敬的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 "..."
}
}
}
}
不幸的是,我绊倒了Docker管道插件的怪异行为。在生成输出中,我可以看到Image.inside(…)命令使用
docker run -t -d -u 1000:1000 ...
这使我的构建失败,因为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 "..."
}
}
}
}
但这会在生成的docker run命令中导致重复的-u开关
docker run -t -d -u 1000:1000 -u otheruser:othergroup ...
显然只有第一个-u适用,因为我的构建仍然失败。我还使用whoami进行调试以验证我的假设。
所以我的问题是:如何改变这种行为?有没有可以关闭-u
1000:1000的开关?这甚至是错误吗?我实际上很喜欢使用Docker插件,因为它通过Jenkins中维护的凭据简化了自己的Docker注册表的使用。但是,如果无法使用Docker插件,还有另一种简单的方法可以实现我的目标吗?
预先感谢您的时间
正如您在此处或此处所看到的那样,对运行Jenkins的用户的uid和gid进行了硬编码(在您的情况下,是在官方docker映像内创建的Jenkins用户)。
您可以通过将–user(或-u)参数传递给docker run
命令来更改在Jenkins映像中运行进程的用户。也许这可以最大程度地减少您的问题。
已编辑
我该如何改变这种行为?有没有可以关闭-u 1000:1000的开关?
您无法在实际版本中更改此行为,因为whoami是硬编码的。
这甚至是错误吗?
在这个拉取请求中,似乎他们正在努力。
但是,如果无法使用Docker插件,还有另一种简单的方法可以实现我的目标吗?
Jenkins随附的新管道插件版本还使用docker-workflow-
plugin运行容器。我不知道另一个插件可以简单地运行它。要解决此问题,您可以以root用户身份运行Jenkins,但这是一个非常丑陋的解决方案。
本文向大家介绍Docker 常用命令,包括了Docker 常用命令的使用技巧和注意事项,需要的朋友参考一下 查看 容器 提交/导出 镜像 帮助
本文向大家介绍如何免sudo使用docker命令详解,包括了如何免sudo使用docker命令详解的使用技巧和注意事项,需要的朋友参考一下 背景 Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源。Docker提供了一种在安全、可重复的环境中自动部署软件的方式,它的出现拉开了基于云计
问题内容: 我面临以下问题:我创建了一个Jenkins Docker容器,并将主机上的Docker套接字与该容器链接。像这样: 然后,当我尝试在詹金斯上创建一些作业时,我收到通常的“权限被拒绝”消息: 尝试在unix:///var/run/docker.sock上连接到Docker守护程序套接字时获得的权限被拒绝:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.29
问题内容: 我想做这样的事情,我可以依次运行多个命令。 问题答案: 想通了,使用 。 例: 多行中的相同示例: 要么:
我需要用docker exec运行2个命令。我正在从docker容器中复制一个文件,不想处理凭据来使用像ssh这样的东西。此命令复制一个文件: 但它会创建一个子目录var/log,我想避免这种情况,所以如果我可以在docker容器中执行这些操作,我应该很好: 如何让docker exec运行2个命令?
问题内容: 在Unix中,我必须将jenkins用户显式添加到Docker组中,以便可以通过shell步骤运行docker命令。 我找不到有关如何在OS X(mac mini 2012)上实现相同目标的答案。 提前致谢。 问候,维克拉姆 问题答案: 我按照票证中的说明操作了 https://github.com/docker/for-mac/issues/799 Docker文档包含Jenkins