1

我正在运行两个虚拟机。一个 VM 用于运行 nextflow,另一个 VM 上有一个 Jenkins 构建服务器。Jenkins 负责构建新的 Docker 镜像并将新的 Docker 镜像推送到我们的私有 google 容器注册表。

我的nextflow.config文件看起来像这样:

process {
    withLabel: awesome_image {
        container = "eu.gcr.io/best-project-1234/coolest_os:latest"
    }
}

在使用 Jenkins 服务器构建新镜像后,我正在运行一个新的 nextflow 脚本,我注意到 nextflow 仍在使用旧镜像。经过一些研究(https://stackoverflow.com/a/58539792/1820480),我意识到这与我使用latest标签的事实有关,并且由于 nextflow VM 上已经有一个名为 latest 的图像, nextflow 使用那个并且不打扰检查注册表。

问题:如何确保在每次运行 nextflow 之前,它会检查注册表中是否有更新的图像?或者,是否有可以在检查注册表(而不是 nextflow)的 VM 上运行的脚本/程序?

谢谢你。

4

1 回答 1

1

Nextflow 只是在容器中使用docker run. 如果您指定尚未拉取的图像,docker run将首先执行docker pull下载/本地化图像。要再次检查注册表以获取较新的图像,您只需确保docker pull在运行 Nextflow 之前调用(针对每个图像)。如果您想在每次生成进程时检查注册表以获取更新的图像,请参见下文。

经过一些研究,看起来最新的 Docker cli (v20.10.0) 现在有一个标志来修改运行容器时的拉取行为:

--pull string   Pull image before running ("always"|"missing"|"never") (default "missing")

这很好,因为这意味着现在应该可以在您的nextflow.config:

docker {
    enabled = true
    runOptions = '--pull=always'
}

但这将产生docker pull为每个生成的进程执行 a 的开销,并且取决于何时将新图像推送到您的注册表,这可能意味着某些进程在您的工作流执行期间会获得不同的容器。如果您只需要“最新”容器并且不关心可重复性,这可能不是问题。

于 2020-12-14T14:40:32.323 回答