web-dev-qa-db-ja.com

Alpine Shellがdockerでファイルを見つけることができません

Alpineとbowtie2と呼ばれるツールを使用して、シンプルなDockerコンテナーをセットアップしました。 bowtie2-align-sを実行しようとすると、次のエラーが発生します。

sh: ./bowtie2-align-s: not found

ただし、lsは、ファイルが存在することを示しています。 Linuxバイナリディストリビューションからbowtie2をインストールしました。そのディストリビューションがAlpine Linuxと互換性があるかどうかはどうすればわかりますか? Ubuntu 16.04でdocker 17.09.0-ceを実行しています。

完全なDockerfileは次のとおりです。

FROM Alpine:3.6

ENV BOWTIE2_VERSION 2.2.8

RUN apk add --no-cache \
        Perl \
        wget \
        openssl \
        ca-certificates \
        strace \
    && wget https://downloads.sourceforge.net/project/bowtie-bio/bowtie2/$BOWTIE2_VERSION/bowtie2-$BOWTIE2_VERSION-linux-x86_64.Zip \
    && unzip -d /usr/local bowtie2-$BOWTIE2_VERSION-linux-x86_64.Zip \
    && rm bowtie2-$BOWTIE2_VERSION-linux-x86_64.Zip

私はそれを次のようにテストします:

$ Sudo docker run -it --rm --security-opt seccomp:unconfined bowtie2-bin sh
/ # /usr/local/bowtie2-2.2.8/bowtie2-align-s --version
sh: /usr/local/bowtie2-2.2.8/bowtie2-align-s: not found
/ # ls -l /usr/local/bowtie2-2.2.8/bowtie2-align-s
-rwxr-xr-x    1 root     root      11600541 Nov 15 18:49 /usr/local/bowtie2-2.2.8/bowtie2-align-s
/ # strace -v -s 1000 /usr/local/bowtie2-2.2.8/bowtie2-align-s --version
execve("/usr/local/bowtie2-2.2.8/bowtie2-align-s", ["/usr/local/bowtie2-2.2.8/bowtie2-align-s", "--version"], ["HOSTNAME=a72609479c9a", "SHLVL=1", "HOME=/root", "TERM=xterm", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "BOWTIE2_VERSION=2.2.8", "PWD=/"]) = -1 ENOENT (No such file or directory)
writev(2, [{iov_base="strace: exec: No such file or directory", iov_len=39}, {iov_base="\n", iov_len=1}], 2strace: exec: No such file or directory
) = 40
writev(2, [{iov_base="", iov_len=0}, {iov_base=NULL, iov_len=0}], 2) = 0
getpid()                                = 11
exit_group(1)                           = ?
+++ exited with 1 +++
/ #

私はstraceの実行を許可するために制限のないアクセスでdockerを実行します。 lsはファイルを見つけましたが、shはそうではないようです。 straceは、アクセスされている他のファイルを表示していないようです。

7
Don Kirkby

BMitchのコメント のおかげで、私は答えを見つけました。 libc6-compat GNU libc互換性のためのパッケージ。dockerファイルの修正バージョンは次のとおりです。

FROM Alpine:3.6

ENV BOWTIE2_VERSION 2.2.8

RUN apk add --no-cache \
        Perl \
        wget \
        openssl \
        ca-certificates \
        libc6-compat \
        libstdc++ \
    && wget https://downloads.sourceforge.net/project/bowtie-bio/bowtie2/$BOWTIE2_VERSION/bowtie2-$BOWTIE2_VERSION-linux-x86_64.Zip \
    && unzip -d /usr/local bowtie2-$BOWTIE2_VERSION-linux-x86_64.Zip \
    && rm bowtie2-$BOWTIE2_VERSION-linux-x86_64.Zip

ソースからbowtie2をビルドしたときにも動作するので、これでうまくいくと思います。互換性パッケージがどれほど信頼できるかわかりません。

すべての詳細が必要な場合は、BMitchの提案に従ってfileパッケージをインストールする必要がありました。

$ Sudo docker run --rm -it bowtie2-bin sh
/ # apk update
fetch http://dl-cdn.alpinelinux.org/Alpine/v3.6/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/Alpine/v3.6/community/x86_64/APKINDEX.tar.gz
v3.6.2-201-g6289c8472a [http://dl-cdn.alpinelinux.org/Alpine/v3.6/main]
v3.6.2-203-g6070fe8ac2 [http://dl-cdn.alpinelinux.org/Alpine/v3.6/community]
OK: 8438 distinct packages available
/ # apk add file
(1/2) Installing libmagic (5.32-r0)
(2/2) Installing file (5.32-r0)
Executing busybox-1.26.2-r7.trigger
OK: 50 MiB in 21 packages
/ # file /usr/local/bowtie2-2.2.8/bowtie2-align-s
/usr/local/bowtie2-2.2.8/bowtie2-align-s: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.9, with debug_info, not stripped

通訳interpreter /lib64/ld-linux-x86-64.so.2は私には疑わしく見え、Alpine Linuxには/lib64フォルダ。少し検索すると、 関連するディスカッション が見つかりました:

実行しようとしているバイナリは、GNU libcに対してリンクされているため、WindowsまたはOSX用にコンパイルされたバイナリが機能しないのと同じように機能しません。

とはいえ、musl libcは部分的なGNU libc互換性を提供します。これは、保証がない場合でも、一部のバイナリーが実際に機能することを意味します。apk add libc6-compat。動作する場合と動作しない場合があります。

私はそれを試してみましたが、libstdc++ パッケージ。これで、バージョン番号を報告するのに十分に機能します。

7
Don Kirkby