Nextflow zieht nicht das "neueste" Docker-Image

Dec 14 2020

Ich verwende zwei VMs. Eine VM wird zum Ausführen von nextflow verwendet, auf der anderen VM befindet sich ein Jenkins-Buildserver. Jenkins ist dafür verantwortlich, neue Docker-Images zu erstellen und neue Docker-Images in unsere private Google Container-Registrierung zu übertragen.

Meine nextflow.configDatei sieht ungefähr so ​​aus:

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

Nachdem ich mit dem Jenkins-Server ein neues Image erstellt hatte, führte ich ein neues nextflow-Skript aus und stellte fest, dass nextflow immer noch das alte Image verwendet. Nach einigen Recherchen (https://stackoverflow.com/a/58539792/1820480) latestWurde mir klar, dass dies mit der Tatsache zu tun hat, dass ich das Tag verwende. Da auf der nextflow-VM bereits ein Image mit dem Namen "last" vorhanden ist, verwendet nextflow dieses Image und überprüft die Registrierung nicht.

Frage: Wie kann ich sicherstellen, dass vor jedem Durchlauf von nextflow die Registrierung auf neuere Images überprüft wird? Oder gibt es ein Skript / Programm, das ich auf der VM ausführen kann und das die Registrierung überprüft (anstelle von nextflow)?

Vielen Dank.

Antworten

1 Steve Dec 14 2020 at 21:40

Nextflow führt Ihre Befehle nur in einem Container mit aus docker run. Wenn Sie ein Bild angeben, das Sie noch nicht gezogen haben, docker runführen Sie zunächst eine docker pullAktion aus, um das Bild herunterzuladen / zu lokalisieren. Um die Registrierung erneut auf neuere Images zu überprüfen, müssen Sie nur sicherstellen, dass Sie docker pull(für jedes Image) aufrufen, bevor Sie Nextflow ausführen. Wenn Sie stattdessen die Registrierung jedes Mal, wenn ein Prozess ausgeführt wird, auf neuere Bilder überprüfen möchten, lesen Sie bitte unten.

Nach einigen Recherchen sieht es so aus, als ob die neueste Docker-Cli (v20.10.0) jetzt ein Flag hat, um das Pull-Verhalten beim Ausführen von Containern zu ändern:

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

Das ist schön, weil es bedeutet, dass es jetzt möglich sein sollte, dies in Ihrem nextflow.config:

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

Dies hat jedoch den Aufwand, docker pullfür jeden erzeugten Prozess eine auszuführen. Je nachdem, wann neue Images in Ihre Registrierung verschoben werden, können einige Prozesse während der Ausführung Ihres Workflows unterschiedliche Container erhalten. Dies ist jedoch möglicherweise kein Problem, wenn Sie nur die "neuesten" Behälter benötigen und sich nicht um die Reproduzierbarkeit kümmern.