4

我正在尝试使用 Rundeck 构建、启动和链接一组 docker 容器。简而言之(对于那些不熟悉 docker 的人),当一个镜像启动时,它会返回一个容器 ID。我想在启动后续作业时使用此容器 ID。

从命令行运行时,它看起来像这样(仅示例!!):

# docker run -Pd 23ABCD45
34DEF123
# docker run -Pd --link 34DEF123:host1 ABC123EF
321CB456

(注意第二个命令行中第一个返回值的使用)

此时,将有两个容器在运行。第二个将通过选项链接到第一个,并且可以使用第二个容器内的主机名host1--link对其进行寻址。公平地说,docker 生成(或可能给出)一个特定的容器名称,可以用来代替容器 ID。我更喜欢使用容器 ID 来避免必须创建/跟踪唯一名称的麻烦。

我希望能够捕获第一个命令的输出(容器 ID),以便可以在第二个命令中重用它。这可能吗?

编辑:这些图像被用于在“docker build”之后立即进行测试(它也输出一个我想包含在我的链中的类似 ID),并且可能后面跟着“docker rm”和“docker rmi”命令,所以有有许多用于捕获这种类型的输出并通过一组相关的操作进行输出的用途。这不仅仅是关于启动/链接容器。

4

1 回答 1

4

没有直接的 Rundeck 实现允许您将一个作业的输出作为输入传递给另一个作业,但是我过去尝试过一些解决方法,并且我已经确定了第二种方法。

1.使用文件传递数据

  1. 在第一个作业中将 ID/输出保存到 tmp 文件中
  2. 第二份工作读取该文件

由于您依赖于文件,因此可能会出错,但是好的代码可以改进。

2. 使用 Rundeck CLI 从另一个作业调用两个作业

这是我正在使用的方法。

JobA打印出两个随机数。

echo $RANDOM;echo $RANDOM

JobB打印出 JobA 产生的第二个随机数,该随机数作为选项“数字”传递

echo "$RD_OPTION_NUMBER is the number JobB received"

JobC调用第一个作业,将最后一行保存到变量并将其传递给 JobB

#!/bin/bash
OUTPUT_FROM_JOB_A=`run -f --id <ID of JobA> | tail -n 1`
run -f --id <ID of JobB> -- -number $OUTPUT_FROM_JOB_A

输出:

[5394] execution status: succeeded
Job execution started:
[5395] JobB <https://hostname:4443/project/Project/execution/show/5395>
6186 is the number JobB received
[5395] execution status: succeeded

这只是原始代码示例。你可以用 python 子进程做很多事情,或者只使用 bash。

于 2017-03-23T17:04:48.080 回答