【问题标题】:Docker container started from inside another container “disappears”从另一个容器内部启动的 Docker 容器“消失”
【发布时间】: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 命令以查看发生了什么,并且确实由于错误而过早结束。这很可能是问题所在 - 这可能对我的情况来说太具体了,我可能会删除这个问题。我们将看看我的解决方案是否真的对其他人有用。不过谢谢!

标签: docker jenkins


【解决方案1】:

事实证明,这种行为的原因是入口点脚本中的一行。
它导致了一个错误,导致脚本在它能够到达最终命令之前就退出了,这将使它永远保持打开状态。

并且由于脚本退出,容器正式完成,因此不再可用于docker top

所以如果有人有类似的问题:
在容器中输入一个终端尝试运行镜像并手动执行docker run 命令附加(没有-d)。这将为您提供入口点中发生的情况的输出,并可能让您了解发生了什么问题。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 2016-01-31
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2017-07-12
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多