docker中的高山shell找不到文件

我已经build立了一个简单的docker集装箱与阿尔卑斯山和一个名为bowtie2的工具。 当我尝试运行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 

我testing它是这样的:

 $ 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 +++ / # 

我运行无限制访问docker允许strace运行。 你可以看到lsfind这个文件,但是sh似乎没有。 strace似乎没有显示任何其他文件被访问,所以发生了什么事?

感谢BMitch的评论 ,我find了答案。 我需要用于GNU libc兼容性的libc6-compat包。 以下是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 

当我从源代码创buildbowtie2的时候,我也得到了它的工作,所以我想我会去。 我不确定兼容性包是多么可靠。

如果你想要所有的细节,我必须安装file包,以遵循BMitch的build议:

 $ 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解释interpreter /lib64/ld-linux-x86-64.so.2对我来说可疑,而Alpine Linux没有/lib64文件夹。 有点search发现了一个相关的讨论 :

您尝试运行的二进制文件与GNU libc链接,因此它不起作用,就像为Windows编译的二进制文件或OSX不起作用一样。

也就是说,musl libc提供了部分GNU libc兼容性,这意味着即使没有任何保证,一些二进制文件也可以正常工作。 尝试apk add libc6-compat 。 它可能会或可能不会工作。

我试过了,发现我还需要libstdc++包。 现在,它可以很好地报告版本号。