【发布时间】:2021-02-09 12:13:21
【问题描述】:
我正在尝试创建一个 Jenkins 设置,该设置将利用 docker 映像来构建各种存储库。
为此,Jenkins 通过 ssh 连接到一个正在运行的 docker 容器(它在 AWS 上,但我认为这不相关?)。
该容器设置为使用主机的 docker(通过卷安装,-v /var/run/docker.sock:/var/run/docker.sock)。以这种方式使用 docker 是可行的,我手动 SSH 到容器,并且能够在容器内正常使用主机的 docker 来构建和运行各种图像。
我正在测试的存储库有一个构建钩子,它会在提交时通知 Jenkins。
它还有一个 Jenkinsfile 和一个完全简单的脚本(此时它实际上只是用于测试 Jenkins):
pipeline {
agent {
docker {
label 'base_agent_1'
image 'lalalala.dkr.ecr.us-east-2.amazonaws.com/base:latest'
registryUrl 'https://lalalala.dkr.ecr.us-east-2.amazonaws.com'
}
}
stages {
stage('STAGE: Build') {
steps {
sh 'docker-credential-ecr-login version'
}
}
stage('STAGE: Run') {
steps {
sh 'docker-credential-ecr-login version'
}
}
stage('STAGE: Test') {
steps {
sh 'docker-credential-ecr-login version'
}
}
stage('STAGE: Push') {
steps {
sh 'docker-credential-ecr-login version'
}
}
}
post {
always {
echo 'The jenkins-build repository run is finished.'
}
changed {
echo 'There is a different result than the last run.'
}
fixed {
echo 'This run fixed problems from the previous one.'
}
regression {
echo 'This run had regressions from the previous run.'
}
aborted {
echo 'This run was aborted.'
}
failure {
echo 'This run failed.'
}
success {
echo 'This run succeeded.'
}
}
}
到目前为止,一切都很好。 Jenkins 收到通知,代理在容器上启动,并从管道开始。
但是,当它运行代理中指定的映像时,会发生此错误(从 Jenkins 日志中复制):
[管道] withDockerContainer jenkins_base_1 似乎正在运行 容器内 444496341bc30a935dd0e9003f372b3f6ece84913aded876766920603db75ca2 搬运工运行 -t -d -u 1000:1000 -w /home/jenkins/workspace/jenkins-builds_main --volumes-from 444496341bc30a935dd0e9003f372b3f6ece84913aded876766920603db75ca2 -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** lalalala.dkr.ecr.us-east-2.amazonaws.com/base:latest cat docker top 7265e124d152e8a0612421ca94d562bcecd913ca904480f12d88d071f2788553-eo pid,comm [Pipeline] // withDockerContainer [Pipeline] } [Pipeline] // withDockerRegistry [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // 节点 [Pipeline] 阶段 [Pipeline] { (Declarative: Post Actions) [Pipeline] echo The jenkins-build 存储库运行完成。 [管道] echo 本次运行 失败的。 [管道] } [管道] // 阶段 [管道] 管道结束
GitHub 已收到此提交的构建结果的通知
java.io.IOException: 运行失败 '7265e124d152e8a0612421ca94d562bcecd913ca904480f12d88d071f2788553'。 错误:来自守护程序的错误响应:容器 7265e124d152e8a0612421ca94d562bcecd913ca904480f12d88d071f2788553 是 没有运行
我尝试在容器内手动执行 docker run 命令 - 尽管没有所有这些 -e ******,因为我不知道这些甚至应该做什么。
该命令成功并返回容器的 ID,因此我假设它已成功启动。
但是当我然后docker container ls 时,没有具有该 ID 的容器。这可以解释 Jenkins 日志中的错误。
但是……这里真正的问题是什么?为什么容器会消失?
图像有一个入口点,所以它不应该直接退出。
实际上,运行命令的容器使用的镜像完全相同——其想法是容器最终应该能够通过 Jenkins 构建和推送自身的更新版本。
【问题讨论】:
-
实际图像是什么? Jenkins 提供了一个覆盖命令,但不会覆盖入口点(请参阅
docker run命令末尾的cat,但没有--entrypoint选项)所以如果您的图像具有硬连线ENTRYPOINT,并且完成后,容器将退出,您会看到您在此处看到的确切症状。 -
无法在此处真正发布图像,因为它不是开源的,但它通常不会自行结束,因为它会打开一个非分离的
sshd。但是,由于正在运行的容器执行完全相同的操作,它可能会以某种方式提前结束。 -
您的评论实际上让我想到了非分离地执行
docker run命令以查看发生了什么,并且确实由于错误而过早结束。这很可能是问题所在 - 这可能对我的情况来说太具体了,我可能会删除这个问题。我们将看看我的解决方案是否真的对其他人有用。不过谢谢!