web-dev-qa-db-fra.com

Alpine Shell ne trouve pas de fichier dans Docker

J'ai mis en place un simple docker container avec Alpine et un outil appelé bowtie2. Lorsque j'essaie d'exécuter bowtie2-align-s, J'obtiens cette erreur:

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

Cependant, ls m'indique que le fichier est là. J'ai installé bowtie2 à partir d'une distribution binaire Linux. Comment savoir si cette distribution est compatible avec Alpine Linux? J'utilise docker 17.09.0-ce sur Ubuntu 16.04.

Voici le Dockerfile complet:

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

Je le teste comme ceci:

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

J'exécute docker avec un accès illimité pour permettre à strace de s'exécuter. Vous pouvez voir que ls trouve le fichier, mais sh ne semble pas le faire. strace ne semble afficher aucun autre fichier en cours d'accès, alors que se passe-t-il?

7
Don Kirkby

Grâce à commentaire de BMitch , j'ai trouvé la réponse. J'avais besoin de libc6-compat package pour GNU compatibilité libc. Voici la version fixe du fichier 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

Je l'ai également fait fonctionner lorsque j'ai construit bowtie2 à partir de la source, donc je pense que je vais y aller. Je ne suis pas sûr de la fiabilité du package de compatibilité.

Si vous voulez tous les détails, j'ai dû installer le package file pour suivre la suggestion de 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

L'interprète interpreter /lib64/ld-linux-x86-64.so.2 m'a paru suspect, et Alpine Linux n'a pas de /lib64 dossier. Une petite recherche a trouvé un discussion connexe :

Le binaire que vous essayez d'exécuter est lié à GNU libc donc il ne fonctionnera pas, tout comme les binaires compilés pour Windows ou OSX ne fonctionneront pas.

Cela dit, musl libc fournit une compatibilité partielle GNU libc, ce qui signifie que certains binaires fonctionneront réellement, même s'il n'y a aucune garantie. Essayez apk add libc6-compat. Cela peut ou peut ne pas fonctionner.

J'ai essayé et j'ai trouvé que j'avais également besoin du libstdc++ paquet. Maintenant, cela fonctionne assez bien pour signaler le numéro de version.

7
Don Kirkby