BioContainers で公開されているコンテナイメージに AWS CLI をインストールしてみる
BioContainers Communityで公開されているイメージと AWS CLI を使いたいときの最良の方法を探しています。目的は AWS Batch で計算実行前後にaws s3
コマンドを使い S3バケットから必要データのダウンロード、S3 バケットへ計算結果のアップロードをしたいです。考えられるパターンを手を動かして試していき良い点、悪い点を確認します。
本記事ではBioContainers で公開されているイメージをベースにして AWS CLI をインストールを試してみます。
確認結果
- Biocontainers で提供されているイメージをベースにして AWS CLI をインストールすることは可能
- 解析ツールのコンテナ毎に AWS CLI インストール手順は異なる可能性があるため、多数のアプリケーションを使う場合は時間と要相談
準備
BUSCO、AWS CLIともにバージョン指定したDockerfileを作成し、AWS CLI を同梱した BUSCO イメージをビルドしてみます。
BUSCO バージョン指定
コンテナリポジトリからタグを確認します。
現時点で最新の5.3.2--pyhdfd78af_0
タグのイメージを利用します。
AWS CLI 最新バージョン確認
CHANGELOGからバージョンを確認します。
現時点で最新の2.5.6
バージョンを利用します。
やってみた
AWS CLI をインストールするにあたり、Biocontainers のコンテナリポジトリにアップされている BUSCO コンテナ生成元を確認したいです。ですが、 Dockerfile を確認できませんでした。出生を探るために調べていたら、まず Conda recipeを作るとあります。
1.3.4 BioContainers build architecture BioContainers build the docker containers from two different sources the Dockerfile or Conda recipes . The BioContainers team first try to create a Conda recipe (if it is possible). If not possible, then a Dockerfile is created. The system automatically builds the container after the pull request is merged into Conda github or BioContainer github repos.
引用: BioContainers Documentation
以下の図を見てビルド方法を把握するのには時間がかかりそうなので諦めました。
画像引用: BioContainers Documentation
BUSCO コンテナを起動しログインするとDebian 10
系であることがわかったのでそれっぽく Dockerfile を書くことにしました。
# cat debian_version 10.9
AWS CLI のバージョン指定のインストール方法は以下のドキュメントを参考にしました。
Installing past releases of the AWS CLI version 2 - AWS Command Line Interface
シンプルにインストールする
Biocontainers の BUSCO イメージをベースに AWS CLI インストールファイルをダウンロードし展開、インストール実行する Dockerfile を作成しました。
FROM quay.io/biocontainers/busco:5.3.2--pyhdfd78af_0 RUN apt-get update && apt-get install -y \ curl \ unzip RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.5.6.zip" -o "/tmp/awscliv2.zip" RUN unzip /tmp/awscliv2.zip -d /tmp RUN /tmp/aws/install
コンテナを起動すると以下のメッセージが出力します。FROM
で指定しているイメージをそのまま実行したときにはメッセージの出力はありませんでした。ちなみに AWS CLI は指定バージョンがインストールされ実行はできました。
$ docker run -it busco:v1 bash /bin/bash: /usr/local/lib/libtinfo.so.6: no version information available (required by /bin/bash) bash: /usr/local/lib/libtinfo.so.6: no version information available (required by bash) root@9012352f9036:/# aws --version aws-cli/2.5.6 Python/3.9.11 Linux/5.10.104-linuxkit exe/x86_64.debian.10 prompt/off
イメージを作る過程のどこでメッセージが出力される状態になったのか切り分けた結果をまとめました。
apt-get update
するだけならメッセージは出力されないapt-get install
するとメッセージが出力されるようになる
メッセージ出力解消のために下手に手を入れるとアプリケーションの実行結果を担保できなくなるなと思ったので、別のアプローチを考えてみます。
確認できたこと
apt-get install
すると通常出力されないメッセージがコンテナ起動時に出力される
マルチステージビルドで回避してみる
apt-get install
すると都合が悪いならばとマルチステージビルドを試してみました。
- AWS CLI のインストールに必要なファイルをダウンロード、展開
- 展開済みのフォルダを使いたいイメージへコピー
- 使いたいイメージで AWS CLI のインストールのみ実行
最終的に実行する BUSCO イメージ内ではapt-get install
は直接実行されることはありません。
FROM debian:stable as builder WORKDIR /tmp RUN apt-get update && apt-get install -y \ curl \ unzip RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.5.6.zip" -o "awscliv2.zip" RUN unzip awscliv2.zip FROM quay.io/biocontainers/busco:5.3.2--pyhdfd78af_0 COPY --from=builder /tmp/aws /tmp/aws RUN /tmp/aws/install
コンテナを起動します。apt-get install
により発生したメッセージの出力なしで AWS CLI を実行できるイメージを作成できました。
$ docker run -it busco:v9 bash root@1d0adda2d4c9:/# aws --version aws-cli/2.5.6 Python/3.9.11 Linux/5.10.104-linuxkit exe/x86_64.debian.10 prompt/off root@1d0adda2d4c9:/# busco -v BUSCO 5.3.2
確認できたこと
- マルチステージビルドなどで AWS CLI のインストールに必要なフォルダを使いたいイメージへコピー
- 使いたいイメージ上で AWS CLI のインストールを実行
- AWS CLI がインストールされた使いたいイメージが完成
その他のイメージならどうなのか?
現状、Biocontainers のコンテナリポジトリにアップされているコンテナ生成元の Dockerfile を確認できていないため、アプリケーションごとにインストール方法を都度考えないといけない可能性がでてきました。
試しにSalmonコンテナを確認してみます。Debian 10
系ではありますがBusyBox
でした。BUSCO コンテナとは異なりapt
コマンドが使えません。
root@d235e0228f06:/tmp# salmon -v salmon 1.8.0 root@d235e0228f06:/tmp# cat debian_version 10.9 root@d235e0228f06:/tmp# busybox BusyBox v1.32.1 (2021-04-13 11:15:36 UTC) multi-call binary. BusyBox is copyrighted by many authors between 1998-2015. Licensed under GPLv2. See source distribution for detailed copyright notices.
コンテナ上で AWS CLI をインストールできるのか確認してみましたが実行できませんでした。
root@d235e0228f06:/tmp# busybox wget "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" root@d235e0228f06:/tmp# busybox unzip awscli-exe-linux-x86_64.zip root@d235e0228f06:/tmp# ./aws/install /tmp/aws/dist/aws: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory Found preexisting AWS CLI installation: /usr/local/aws-cli/v2/current. Please rerun install script with --update flag.
様々な解析ツールがあるなかで個別に AWS CLI をインストールを試していくのは骨が折れそうです。
まとめ
Biocontainers で提供されているイメージをベースにして AWS CLI をインストールすることは可能でした。 BUSCO と、Salmon コンテナの2つを確認した限りですと、コンテナ毎に AWS CLI インストール手順は異なる可能性があります。 複数の解析ツールがあるなかで AWS CLI を同梱するために個別に調査・対応は骨が折れるのではないでしょうか。
おわりに
もっともシンプルなパターンを試してみた結果、「できることにはできるけど個別対応になり、用意するのに時間がかかってしまうなぁ」といった印象です。 アプリケーションコンテナには手を入れず AWS CLI を同梱しないのがベターな選択かもしれませんが、やってみたら以外と!ということもあるかもしれないので引き続き確認してみた結果を共有したいと思います。
BioContainers Documentationを読んでコンテナイメージのビルド方法を確認するのが近道かもしれないと思いつつ、初回ということもあり手を動かして確認したかったのでとりあえずやってみました。