O shell Alpine não consegue encontrar o arquivo no docker

3

Eu configurei um contêiner docker simples com o Alpine e uma ferramenta chamada bowtie2. Quando tento executar bowtie2-align-s , recebo este erro:

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

No entanto, ls me diz que o arquivo está lá. Eu instalei o bowtie2 de uma distribuição binária do Linux. Como eu diria se essa distribuição é compatível com o Alpine Linux? Estou executando o docker 17.09.0-ce no Ubuntu 16.04.

Este é o Dockerfile completo:

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

Eu testo assim:

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

Eu executo o docker com acesso não confinado para permitir que strace seja executado. Você pode ver que ls encontra o arquivo, mas sh não parece. strace parece não mostrar nenhum outro arquivo sendo acessado, então o que está acontecendo?

    
por Don Kirkby 15.11.2017 / 20:03

1 resposta

2

Graças ao comentário da BMitch , encontrei a resposta. Eu precisava do pacote libc6-compat para compatibilidade GNU libc. Aqui está a versão fixa do arquivo 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

Eu também trabalhei quando eu criei o bowtie2 da fonte, então eu acho que vou com isso. Não tenho certeza de quão confiável é o pacote de compatibilidade.

Se você quiser todos os detalhes, eu tive que instalar o pacote file para seguir a sugestão do 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

O intérprete interpreter /lib64/ld-linux-x86-64.so.2 pareceu suspeito para mim, e o Alpine Linux não tem uma pasta /lib64 . Uma pequena pesquisa encontrou uma discussão relacionada :

The binary you try to run is linked against GNU libc so it will not work, just like binaries compiled for windows or OSX will not work.

That said, musl libc provides partial GNU libc compatibility, which means that some binaries will actually work, even if there are no guarantee. Try apk add libc6-compat. It may or may not work.

Eu tentei isso e descobri que também precisava do pacote libstdc++ . Agora funciona bem o suficiente para relatar o número da versão.

    
por 16.11.2017 / 01:53