acobster
acobster

Reputation: 1657

"ELF: not found" and "syntax error: unexepected \"(\"" in Docker container

I am trying to build a Docker image for beanstalkd-cli. The image builds successfully, but when I run docker run -it myimage, it fails with:

/usr/local/bin/beanstalkd-cli: line 1: ELF: not found
/usr/local/bin/beanstalkd-cli: line 2: syntax error: unexpected "("

Does this mean the build is bad? Or do I need to tweak ENTRYPOINT and/or CMD?

Here is my Dockerfile:

FROM alpine:3.5

LABEL maintainer="Coby Tamayo <[email protected]"

# Install openssl, beanstalkd-cli
RUN apk add --update openssl && \
  wget https://github.com/schickling/beanstalkd-cli/releases/download/0.3.0/beanstalkd-cli-linux.tar.gz && \
  tar -xvzf beanstalkd-cli-linux.tar.gz && \
  chmod +x beanstalkd-cli && \
  mv beanstalkd-cli /usr/local/bin/beanstalkd-cli && \
  rm beanstalkd-cli-linux.tar.gz

ENTRYPOINT ["/bin/sh"]
CMD ["/usr/local/bin/beanstalkd-cli"]

Update 1

When I remove the ENTRYPOINT and CMD completely, running the container drops me into a shell, where I can verify that beanstalkd-cli has execute permissions set:

$ docker run -it myimage
/ # which beanstalkd-cli
/usr/local/bin/beanstalkd-cli
/ # ls -la /usr/local/bin/beanstalkd-cli
-rwxrwxr-x    1 1000     1000       3020529 Feb 23  2015 /usr/local/bin/beanstalkd-cli

Just "for fun," I also tried setting only ENTRYPOINT, with no command, since I really don't care about running anything except beanstalkd-cli commands in this container:

ENTRYPOINT ["/usr/local/bin/beanstalkd-cli"]
# no more CMD

When I docker run this, I get:

standard_init_linux.go:185: exec user process caused "no such file or directory"

Same result if I add the original CMD back in. Huh?

Update 2

# file /usr/local/bin/beanstalkd-cli
/usr/local/bin/beanstalkd-cli: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=63a19b18574643c1da5bafd5bd56fc26af22ab05, not stripped

# uname -a
Linux 6882ec36481d 4.10.0-40-generic #44~16.04.1-Ubuntu SMP Thu Nov 9 15:37:44 UTC 2017 x86_64 Linux

# /usr/local/bin/beanstalkd-cli
/bin/sh: /usr/local/bin/beanstalkd-cli: not found

Upvotes: 2

Views: 13609

Answers (1)

Charles Duffy
Charles Duffy

Reputation: 295650

Diagnosing The Problem

Using your Dockerfile:

docker run 04d32bac400e '-xlic' 'ldd /usr/local/bin/beanstalkd-cli'

...emits:

+ ldd /usr/local/bin/beanstalkd-cli
    /lib64/ld-linux-x86-64.so.2 (0x7f9044206000)
    libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f9044206000)
    libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f9044206000)
    librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f9044206000)
    libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f9044206000)
    libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f9044206000)
Error loading shared library libgcc_s.so.1: No such file or directory (needed by /usr/local/bin/beanstalkd-cli)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /usr/local/bin/beanstalkd-cli)
Error relocating /usr/local/bin/beanstalkd-cli: __gcc_personality_v0: symbol not found
Error relocating /usr/local/bin/beanstalkd-cli: __register_atfork: symbol not found
Error relocating /usr/local/bin/beanstalkd-cli: __rawmemchr: symbol not found
Error relocating /usr/local/bin/beanstalkd-cli: _Unwind_DeleteException: symbol not found
Error relocating /usr/local/bin/beanstalkd-cli: _Unwind_RaiseException: symbol not found
Error relocating /usr/local/bin/beanstalkd-cli: _Unwind_FindEnclosingFunction: symbol not found
Error relocating /usr/local/bin/beanstalkd-cli: _Unwind_GetIP: symbol not found
Error relocating /usr/local/bin/beanstalkd-cli: _Unwind_Backtrace: symbol not found
Error relocating /usr/local/bin/beanstalkd-cli: _Unwind_Resume: symbol not found

So -- the beanstalkd libraries you're using are linked against libgcc_s.so.1 and ld-linux-x86-64.so.2, neither of which is provided by the Alpine 3.5 base image; hence, "no such file or directory" when trying to run the executable.


The Easy Solution

Consider a heavier-weight base image; the following, for example, works properly:

FROM ubuntu:16.04

LABEL maintainer="Coby Tamayo <[email protected]>"

# Install openssl, beanstalkd-cli
RUN apt-get update
RUN apt-get install -y wget
RUN wget https://github.com/schickling/beanstalkd-cli/releases/download/0.3.0/beanstalkd-cli-linux.tar.gz && \
  tar -xvzf beanstalkd-cli-linux.tar.gz && \
  chmod +x beanstalkd-cli && \
  mv beanstalkd-cli /usr/local/bin/beanstalkd-cli && \
  rm beanstalkd-cli-linux.tar.gz

CMD ["/usr/local/bin/beanstalkd-cli"]

Upvotes: 6

Related Questions