【问题标题】:Execute command inside docker image and save it in Jenkinsfile在 docker 镜像中执行命令并将其保存在 Jenkinsfile 中
【发布时间】:2020-07-31 06:01:27
【问题描述】:

我正在处理 Jenkins 文件,该文件正在拉取 docker 映像并在此 docker 映像中执行一些命令,然后在我想保存此映像并将其推送到 AWS ECR 之后。 在这里执行 docker 容器内的命令并将 docker 镜像推送到 ECR 部分正在工作,并且不知道如何提交(保存)更新的 docker 镜像。

在里面执行命令

stage('Run inside Docker container') {
  agent {
    docker { image 'test/testimage:619c95b' }
  }
  steps {
    sh 'ls & pwd & ps'
  }
}

保存 Docker 镜像

???

推送到 AWS ECR

steps {
    script {
      docker.withRegistry('https://xxxxxxxxxxx.dkr.ecr.us-east-2.amazonaws.com/', 'ecr:us-east-2:aws-xx-automation') {
        image.push("${env.tag}")
      }
    }
  }

【问题讨论】:

    标签: docker jenkins jenkins-pipeline docker-registry declarative


    【解决方案1】:

    您可以将其构建成一个简单的 Dockerfile:

    FROM test/testimage:619c95b  # docker { image ... }
    RUN ls && pwd && ps          # sh "..."
    

    您可以在开发者系统上测试和运行生成的图像。 (我在本地测试复杂的 Jenkins 管道时运气不佳。)

    现在您的 Jenkins 管道代码可以构建和推送该映像:

    steps {
      script {
        image = docker.build("${env.tag}")
        docker.withRegistry('https://xxxxxxxxxxx.dkr.ecr.us-east-2.amazonaws.com/', 'ecr:us-east-2:aws-xx-automation') {
          image.push()
        }
      }
    }
    

    您描述的方法(可能)在技术上是不可能的。如果你查看 Jenkins 日志,你会看到一个很长的 docker run 命令,它(除其他外)有一个 -v 选项,用于将构建工作目录挂载到同一路径上的映像中。这意味着您在构建工作目录中所做的任何更改都无法提交到映像中,它们仅存在于该 Jenkins 管理的目录中。

    【讨论】:

    • 不使用 docker 文件
    【解决方案2】:

    首先,我不太确定您的目标方式是否是最佳实践。除此之外,我会以你的方式回答你的问题。

    命令在 docker 容器 = docker 映像的实例 中执行,而不是 docker 映像。 所以,stage 应该被命名为 'Run inside Docker container from image foo'

    例如,从您的映像 'test/testimage:619c95b' 创建一个名为 mycontainer 的 docker 容器后,您可以使用以下命令保存您的映像

    docker commit <mycontainer> <mynew docker image tag>
    

    通过此步骤,图像将与您的容器当前快照一起保存。

    最后,使用 &lt;mynew docker image tag&gt; 设置/导出 env.tag 并执行

    docker.withRegistry('https://xxxxxxxxxxx.dkr.ecr.us-east-2.amazonaws.com/',
      'ecr:us-east-2:aws-xx-automation') {
            image.push("${env.tag}")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 2021-11-18
      • 2020-11-24
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      相关资源
      最近更新 更多