在 docker 图像中执行命令并将其保存在 Jenkinsfile 中

Execute command inside docker image and save it in Jenkinsfile

我正在处理 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 容器 = docker 图像 的实例中执行,而不是 docker 图片。 因此,stage 应该被命名为 '运行 inside Docker container from image foo'

例如,从名为 mycontainer 的图像 'test/testimage:619c95b' 创建 docker 容器后,您可以将图像保存为

docker commit <mycontainer> <mynew docker image tag>

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

最后,set/export env.tag 与 <mynew docker image tag> 并执行

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

您可以将其构建到一个简单的 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 管理的目录中。