8 votes

Alpine Shell ne trouve pas de fichier dans docker

J'ai mis en place un simple conteneur docker 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 me dit que le fichier est là. J'ai installé bowtie2 à partir d'une distribution binaire Linux. Comment puis-je savoir si cette distribution est compatible avec Alpine Linux ? J'exécute docker 17.09.0-ce sur Ubuntu 16.04.

Voici le fichier Docker 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 +++
/ #

Je lance Docker avec un accès non limité pour permettre strace pour courir. Vous pouvez voir que ls trouve le fichier, mais sh ne semble pas le faire. strace ne semble pas montrer d'autres fichiers en cours d'accès, alors que se passe-t-il ?

11voto

Quibblesome Points 14441

Merci à Commentaire de BMitch j'ai trouvé la réponse. J'avais besoin du libc6-compat pour la compatibilité avec GNU libc. Voici la version corrigée 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

J'ai également réussi à le faire fonctionner lorsque j'ai construit bowtie2 à partir des sources, donc je pense que je vais utiliser ce système. Je ne suis pas sûr de la fiabilité du paquet de compatibilité.

Si vous voulez tous les détails, j'ai dû installer le programme file paquet 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 permis de trouver un discussion connexe :

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

Cela dit, musl libc offre une compatibilité partielle avec 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 fonctionner ou non.

J'ai essayé, et j'ai constaté que j'avais également besoin de l'option libstdc++ paquet. Maintenant, il fonctionne assez bien pour rapporter le numéro de version.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X