Sh: ./elástico-agente: no se encuentra cuando se intenta ejecutar la elástica del agente en Alpine Linux

0

Pregunta

Estoy tratando de configurar la Elástica del Agente en un contenedor docker ejecutando otro servicio. El contenedor se basa en Alpine Linux, sin embargo, que no se puede ejecutar la elástica-agente de comandos después de descargar y extraer el agente : se queja acerca de un "no se encuentra el archivo, mientras que el archivo existe realmente!

He aquí una mínima reproductible ejemplo

docker run --rm -it alpine sh
# cd /opt
# wget https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-7.14.2-linux-x86_64.tar.gz
# tar xvf elastic-agent-7.14.2-linux-x86_64.tar.gz
# cd elastic-agent-7.14.2-linux-x86_64/
# ./elastic-agent
sh: ./elastic-agent: not found
# ls -la
total 8452
drwxr-xr-x    3 root     root          4096 Nov 18 17:38 .
drwxr-xr-x    1 root     root          4096 Nov 18 17:38 ..
-rw-r--r--    1 root     root            41 Sep 15 17:00 .build_hash.txt
-rw-r--r--    1 root     root            41 Sep 15 17:00 .elastic-agent.active.commit
-rw-r--r--    1 root     root         13675 Sep 15 16:54 LICENSE.txt
-rw-r--r--    1 root     root       8586842 Sep 15 16:54 NOTICE.txt
-rw-r--r--    1 root     root           866 Sep 15 17:00 README.md
drwxr-xr-x    3 root     root          4096 Nov 18 17:38 data
lrwxrwxrwx    1 root     root            39 Nov 18 17:38 elastic-agent -> data/elastic-agent-574c21/elastic-agent
-rw-r--r--    1 root     root          9020 Sep 15 16:55 elastic-agent.reference.yml
-rw-------    1 root     root          9017 Sep 15 16:55 elastic-agent.yml
# ./data/elastic-agent-574c21/elastic-agent
sh: ./data/elastic-agent-574c21/elastic-agent: not found

Yo estoy corriendo en un x86_64 host como se puede ver la versión del kernel o paquete de los repositorios:

# uname -a
Linux 59ae07b0dca8 5.10.47-linuxkit #1 SMP Sat Jul 3 21:51:47 UTC 2021 x86_64 Linux
# apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
v3.14.3-14-g9234faeb0d [https://dl-cdn.alpinelinux.org/alpine/v3.14/main]
v3.14.3-12-g13e0706e2c [https://dl-cdn.alpinelinux.org/alpine/v3.14/community]
OK: 14942 distinct packages available

En que se parece el binario puede vincular a las bibliotecas correctamente:

# ldd  ./data/elastic-agent-574c21/elastic-agent
    /lib64/ld-linux-x86-64.so.2 (0x7f1868c2f000)
    libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f1868c2f000)
    libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f1868c2f000)
    libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f1868c2f000)

También tiene los permisos para ejecutar

# ls -la /usr/local/bin/elastic-agent-7.14.2-linux-x86_64/data/elastic-agent-574c21/
total 57244
drwxr-xr-x    3 root     root          4096 Nov 18 17:38 .
drwxr-xr-x    3 root     root          4096 Nov 18 17:38 ..
drwxr-xr-x    2 root     root          4096 Nov 18 17:38 downloads
-rwxr-xr-x    1 root     root      58603536 Sep 15 17:00 elastic-agent

strace no parece ayudar a ni

# strace -f ./elastic-agent
execve("./elastic-agent", ["./elastic-agent"], 0x7fff9e17bee8 /* 7 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++

Me estoy perdiendo algo? Podría Alpino evitar un binario de partida bajo ciertas condiciones?

Gracias por su ayuda!

alpine docker elastic-stack
2021-11-18 17:55:09
1

Mejor respuesta

2

El problema parece ser que la versión compilada de elastic-agent que has descargado requiere de libc. Alpine linux utiliza muslc.

Uno puede instalar glibc en los alpes de uso https://stackoverflow.com/a/38433396/5666087. Y, a continuación, elastic-agent parece que funciona.

FROM alpine
WORKDIR /opt
RUN wget -qO - https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-7.14.2-linux-x86_64.tar.gz \
    | tar xz
# Add glibc
RUN wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
    && wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk \
    && apk add glibc-2.28-r0.apk \
    && rm glibc-2.28-r0.apk

Y ejecutar la imagen resultante (supongamos que es llamado elastic):

docker run --rm -it elastic /opt/elastic-agent-7.14.2-linux-x86_64/elastic-agent
2021-11-18 18:48:38

Que solucionado, gracias! He aprendido otra cosa sobre la base de las bibliotecas de Linux hoy en día.
Thomas P.

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................