I want to build a docker image in my pipeline and then run a job inside it, without pushing or pulling the image.
Is this possible?
答案 0 :(得分:3)
根据设计,您无法在管道中的作业之间传递工件,而无需使用某种外部资源来存储它。但是,您可以在单个作业中传递任务。此外,您还可以在每个任务级别而不是按作业级别指定图像。因此,执行所需操作的最简单方法可能是创建一个具有生成docker-image的第一个任务的单个作业,以及将其作为容器图像使用的第二个任务。
在您的情况下,您将在构建任务中构建docker镜像并使用docker export
将图像的文件系统导出到rootfs,您可以将其放入输出(my-task-image
) 。请记住它需要匹配的rootfs输出的特定模式。您将需要rootfs / ...(提取的' docker export')和metadata.json,它们只能包含一个空的json对象。您可以查看docker-image-resource中的脚本,以获取有关如何使其与架构匹配的更多信息:https://github.com/concourse/docker-image-resource/blob/master/assets/in。然后在后续任务中,您可以在管道yml中添加image参数:
- task: use-task-image
image: my-task-image
file: my-project/ci/tasks/my-task.yml
以便在任务中使用构建的图像。
答案 1 :(得分:1)
该答案当前无效,因为“ dry_run” PR被拒绝了。参见https://github.com/concourse/docker-image-resource/pull/185
如果找到可行的方法,我将在这里进行更新。
2017年10月添加到docker资源的“ dry_run”参数现在允许使用此(github pr)
您需要添加一个虚拟docker资源,例如:
resources:
- name: dummy-docker-image
type: docker-image
icon: docker
source:
repository: example.com
tag: latest
- name: my-source
type: git
source:
uri: git@github.com:me/my-source.git
然后添加一个构建步骤,该步骤将推入该docker资源,但设置为“ dry_run”,这样实际上不会压入任何东西:
jobs:
- name: My Job
plan:
- get: my-source
trigger: true
- put: dummy-docker-image
params:
dry_run: true
build: path/to/build/scope
dockerfile: path/to/build/scope/path/to/Dockerfile