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