我已经使用 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 +++
/ #
我运行 docker 并以不受限制的访问权限允许strace
运行。您可以看到ls
找到了文件,但sh
似乎没有找到。strace
似乎没有显示正在访问任何其他文件,那么发生了什么?
答案1
谢谢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 时,我也让它工作了,所以我想我会使用它。我不确定兼容性包有多可靠。
如果您想要了解所有详细信息,我必须安装该file
软件包以遵循 BMitch 的建议:
$ 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++
包。现在它可以正常工作并报告版本号。