Nextflowは「最新の」Dockerイメージをプルしません

Dec 14 2020

2つのVMを実行しています。1つのVMはnextflowの実行に使用され、もう1つの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タグを使用しているという事実に関係していることに気付きました。nextflowVMにはlatestというイメージが既に存在するため、nextflowはそれを使用し、レジストリをチェックする必要はありません。

質問:nextflowを実行するたびに、レジストリで新しいイメージをチェックするようにするにはどうすればよいですか?または、(nextflowの代わりに)レジストリをチェックするVMで実行できるスクリプト/プログラムはありますか?

ありがとうございました。

回答

1 Steve Dec 14 2020 at 21:40

Nextflowは、を使用してコンテナ内でコマンドを実行するだけdocker runです。まだプルしていないイメージを指定した場合docker runは、最初docker pullにイメージをダウンロード/ローカライズします。レジストリで新しいイメージを再度確認するには、docker pullNextflowを実行する前に(イメージごとに)呼び出す必要があります。代わりに、プロセスが生成されるたびにレジストリで新しいイメージを確認する場合は、以下を参照してください。

調査の結果、最新の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生成されたプロセスごとにを実行するオーバーヘッドがあり、新しいイメージがレジストリにプッシュされるタイミングによっては、ワークフローの実行中に一部のプロセスが異なるコンテナを取得する可能性があります。ただし、「最新の」コンテナのみが必要で、再現性を気にしない場合は、これは問題にならない可能性があります。