Container with alpine failing to execute a file with not found

docker alpine not found error

3 min read | by Jordi Prats

While building a container using alpine as a base image we can get a not found error while trying to execute a file that doesn't make much sense:

$ docker run -it test /usr/local/bin/example-app
exec /usr/local/bin/example-app: no such file or directory

As a reference for this example I'm building the image using the following Dockerfile:

FROM golang:1.18.3 as builder

WORKDIR /build
ADD . /build
RUN make all

FROM alpine:latest

COPY --from=builder /build/example-app /usr/local/bin

The file have the correct permissions to be executes:

$ docker run -it test ls -l /usr/local/bin/example-app
-rwxr-xr-x    1 root     root      43434977 Nov 10 19:21 /usr/local/bin/example-app

We can even check with file that it really is an executable:

$ docker run -it test file /usr/local/bin/example-app
/usr/local/bin/example-app: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/, Go BuildID=lS3JON4J0nXBp2Z8OsMY/LukFvNH5JW5C08zFWRbL/9Px4OAp_95wJEUVDA5pX/Cmzbv3KWAAOCiYSI2-dX, not stripped

We won't be able to execute it, not even spawning a shell into the container (docker exec) or running an interactive one:

$ docker run -it test sh
/app-data # cd /usr/local/bin/
/usr/local/bin # ls
/usr/local/bin # ls -la
total 86196
drwxr-xr-x    1 root     root          4096 Nov 10 19:22 .
drwxr-xr-x    1 root     root          4096 Aug  9 08:49 ..
-rwxr-xr-x    1 root     root      43434977 Nov 10 19:21 example-app
/usr/local/bin # ./example-app
sh: ./example-app: not found

On alpine containers, having the not found error is a typical symptom of dynamic link failure. We need to bear in mind that alpine uses the musl libc library so if the executable is looking for glibc executables it won't find them.

To be able to use binaries built to use glibc with musl, we can create symbolic links for the paths libraries they are looking for: There's a package already available that will do that for us:

apk add libc6-compat

Alternatively, we can change the base image to use one that doesn't use the musl library as well, such as Debian to completely avoid the problem:

FROM golang:1.18.3 as builder

WORKDIR /build
ADD . /build
RUN make all

FROM debian:11-slim

COPY --from=builder /build/example-app /usr/local/bin

Posted on 14/11/2022