Nextflow のローカル開発環境のために Docker コンテナを利用してみてわかったこと

Nextflowに入門して気がついたこと
2023.05.03

Amazon Omics の検証ために Nextflow のパイプラインの動作確認環境を手元に用意したくなりました。ローカル PC に Nextflow を直接インストールしたくはなかっため、Docker コンテナでnextflowコマンドを実行してみてわかったことを整理しました。

確認結果

  • Nextflow をインストールするならホストサーバーへ直接インストールのがベターな構成
  • Nextflow 自体を Docker コンテナで実行すると同じイメージ内に必要なバイオインフォマティクスのツール類もインストールしておく必要があった
  • Nextflow だけインストールされた Docker コンテナではチュートリアルのパイプラインの動作確認には利用できた

Nextflow のローカル開発環境を作成する

Docker コンテナでローカル開発環境を作成します。まずは提供されているコンテナイメージの確認からはじめます。

Nextflow 最新バージョン確認

GitHub のリリースノートから最新バージョンを確認できます。現時点の最新は23.04.1でした。

Releases · nextflow-io/nextflow

コンテナイメージ取得先

ECR Public Gallery を採用しました。コンテナイメージのリポジトリは各所見回ってきた結果を共有します。

Docker Hub

最新の23.04.1のイメージがアップされていました。

nextflow/nextflow Tags | Docker Hub

ゲストユーザーの Pull レートリミットのことを考えたくはないため採用は見送りました。

For anonymous users, the rate limit is set to 100 pulls per 6 hours per IP address. For authenticated users, it’s 200 pulls per 6 hour period. Users with a paid Docker subscription get up to 5000 pulls per day.

For anonymous users, the rate limit is set to 100 pulls per 6 hours per IP address. For authenticated users, it’s 200 pulls per 6 hour period. Users with a paid Docker subscription get up to 5000 pulls per day.

Biocontainers

本命だと考えていた Biocontainers にアップされているイメージの最新は22.10.6でした。Nextflow のアップデートに追従されていないため採用を見送りました。

biocontainers/nextflow · Quay

ECR Public Gallery

Biocontainers のクローンだと思っていた ECR Public Gallery なのですが Nextflow 23.04.1がアップされていました。今回は ECR Public Gallery のイメージを採用しました。

docker-compose の作成

ローカルディレクトリをコンテナへマウントしてnextflowコマンドを実行したかったため簡単な docker-compose.yaml を用意しました。

  • コンテナイメージは自前で手を入れずに素の Nextflow のイメージを利用しています
  • commandで何かコマンドを走らせないとコンテナが起動してもすぐに停止してしまうため対策しています

docker-compose.yaml

version: '3'

services:
  app:
    image: public.ecr.aws/seqera-labs/nextflow:23.04.1
    volumes:
      - .:/workspace:cached
    working_dir: /workspace
    tty: true
    command: >
      /bin/bash -c "
        pwd
        /bin/bash
      "

実行してみる

Nextflow のコンテナを起動しコンテナ内でnextflowコマンドを使ってみます。

$ docker-compose up -d
$ docker-compose exec app bash

動作確認用に Hello world を実行してみました。正常に動作しています。

実行結果

# nextflow run hello
N E X T F L O W  ~  version 23.04.1
Pulling nextflow-io/hello ...
 downloaded from https://github.com/nextflow-io/hello.git
Launching `https://github.com/nextflow-io/hello` [trusting_bohr] DSL2 - revision: 1d71f857bb [master]
executor >  local (4)
[00/ee9350] process > sayHello (4) [100%] 4 of 4 ✔
Hello world!

Ciao world!

Bonjour world!

Hola world!

Nextflow のワークフローの動作確認したいためチュートリアルに従い実行してみます。

Get started — Nextflow 23.04.1 documentation

チュートリアルのワークフローをコピペしtutorial.nfを作成しました。

tutorial.nf

params.str = 'Hello world!'

process splitLetters {
  output:
    path 'chunk_*'

  """
  printf '${params.str}' | split -b 6 - chunk_
  """
}

process convertToUpper {
  input:
    path x
  output:
    stdout

  """
  cat $x | tr '[a-z]' '[A-Z]'
  """
}

workflow {
  splitLetters | flatten | convertToUpper | view { it.trim() }
}

定義した2つのプロセスが走り実行結果を出力できました。

実行結果

bash-4.2# nextflow run tutorial.nf

N E X T F L O W  ~  version 23.04.1
Launching `tutorial.nf` [ecstatic_brenner] DSL2 - revision: 7ed0e799f3
executor >  local (3)
 process > splitLetters       [100%] 1 of 1 ✔
[d7/5e4656] process > convertToUpper (1) [100%] 2 of 2 ✔
WORLD!
HELLO

重要なことに気がつく

Nextflow のローカル開発環境が準備できたので Nextflow のワークフローの書き方などのお作法を調べていました。

バイオインフォマティクスツールのインストールは Bioconda を使えば比較的楽に導入できるとはいえ、各ツールは再現性担保のためにもイミュータブルなコンテナを利用して管理、実行したいと考えていました。

その場合、ワークフローには以下の様に記述すればコンテナで実行できるとドキュメントに書いてありました。

Containers — Nextflow 23.04.1 documentation

process {
    withName:foo {
        container = 'image_name_1'
    }
    withName:bar {
        container = 'image_name_2'
    }
}
charliecloud {
    enabled = true
}

ここで疑問

Nextflow を管理しているのはコンテナ、各種ツールを実行するためにコンテナからコンテナを呼んで別に起動させて動くのか?動いてもその構成が本当に正しいのか?と疑問になりました。

以下のディスカッションを見つけました。こういった構成は理想的ではないので避けた方がいいと言われています。

Even though this is possible (docker within docker), it is not ideal and should be avoided. Nextflow is easy enough to install (it's just a file downloaded) and Java is practically everywhere, so you should be able to run nextflow natively wherever you are ?

Running nextflow inside docker container · nextflow-io/nextflow · Discussion #3177

Nextflow のインストールは Java とバイナリさえあれば動くこともあり、ホストのサーバーに Nextflow をインストールするのがベターな構成の様でした。

各種ツールはコンテナで実行したい場合は、ホストにインストールした Nextflow でパイプラインを実行して、そこから各種ツール用のコンテナを呼んで実行すると理解しました。仮に Nextflow 自体をコンテナで実行するなら同じコンテナイメージに必要なツール類をインストールしておく必要があるようです。

オンプレの Nextflow の構成ですとホストに Nextflow も各種ツールもインストール済みでパイプラインから呼んで実行するのが一般的なのではないかと予想しています。

まとめ

  • Nextflow をインストールするならホストサーバーへ直接インストールのがベターな構成
  • Nextflow 自体を Docker コンテナで実行すると同じイメージ内に必要なバイオインフォマティクスのツール類もインストールしておく必要があった
  • Nextflow だけインストールされた Docker コンテナではチュートリアルのパイプラインの動作確認には利用できた

おわりに

ドキュメントを読むだけでは想像力が足りなく Nextflow のパイプライン内の必要要素まで考慮できていませんでした。手を動かしながら学ぶことで Nextflow を少し理解できました。次回は EC2 に Nextflow インストールしてみて動作確認をしてみます。

2023/5/3追記
EC2 へインストールも試してみてブログをアップしました。

参考