BioContainers で公開されているコンテナイメージに AWS CLI をインストールしてみる

2022.04.19

BioContainers Communityで公開されているイメージと AWS CLI を使いたいときの最良の方法を探しています。目的は AWS Batch で計算実行前後にaws s3コマンドを使い S3バケットから必要データのダウンロード、S3 バケットへ計算結果のアップロードをしたいです。考えられるパターンを手を動かして試していき良い点、悪い点を確認します。

本記事ではBioContainers で公開されているイメージをベースにして AWS CLI をインストールを試してみます。

  • もっともシンプルな AWS CLI のインストールパターンです
  • BUSCOのコンテナイメージを例に試しました
  • 比較のためSalmonコンテナも追加で試しました

確認結果

  • 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 を作成しました。

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すると都合が悪いならばとマルチステージビルドを試してみました。

  1. AWS CLI のインストールに必要なファイルをダウンロード、展開
  2. 展開済みのフォルダを使いたいイメージへコピー
  3. 使いたいイメージで AWS CLI のインストールのみ実行

最終的に実行する BUSCO イメージ内ではapt-get installは直接実行されることはありません。

Dockerfile

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

確認できたこと

  1. マルチステージビルドなどで AWS CLI のインストールに必要なフォルダを使いたいイメージへコピー
  2. 使いたいイメージ上で AWS CLI のインストールを実行
  3. 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を読んでコンテナイメージのビルド方法を確認するのが近道かもしれないと思いつつ、初回ということもあり手を動かして確認したかったのでとりあえずやってみました。

参考