CatMe0w
CatMe0w

Reputation: 83

Docker: "not found" for an existing file

I'm trying to run an existing binary file in a Docker container.

Files in current folder:

$ ls .
app  Dockerfile  run.sh

Dockerfile:

FROM alpine:latest
COPY . /app/
RUN chmod +x /app/run.sh && chmod +x /app/app
WORKDIR /app
ENTRYPOINT ["./run.sh"]

run.sh:

#!/bin/sh
./app
ls

(The ls command is used to check if the app not exists)

Build command and outputs:

$ sudo docker build . -t app_test
Sending build context to Docker daemon  3.427MB
Step 1/5 : FROM alpine:latest
 ---> 11cd0b38bc3c
Step 2/5 : COPY . /app/
 ---> 4c69dfe88b2e
Step 3/5 : RUN chmod +x /app/run.sh && chmod +x /app/app
 ---> Running in 0dbdc9045827
Removing intermediate container 0dbdc9045827
 ---> 9193aeee2c8f
Step 4/5 : WORKDIR /app
 ---> Running in 9ecb2ad7c3f1
Removing intermediate container 9ecb2ad7c3f1
 ---> 1c748d0cb0b2
Step 5/5 : ENTRYPOINT ["./run.sh"]
 ---> Running in 24ebb7500202
Removing intermediate container 24ebb7500202
 ---> adcd6e94a37f
Successfully built adcd6e94a37f
Successfully tagged app_test:latest

Run command:

$ sudo docker run -it app_test
./run.sh: line 2: ./app: not found
Dockerfile  app         run.sh

From the output of ls command, we can find app exists, but it seems sh cannot find it.

I also tried run ./app directly or use ["sh", "run.sh"] instead in ENTRYPOINT or CMD, but it doesn't help.

EDIT: This app is a closed source software and only a compiled executable is distributed. I'm sorry I cannot provide more information.

Upvotes: 7

Views: 5015

Answers (1)

BMitch
BMitch

Reputation: 263469

If app is a shell script, then the error refers to the first line of that script, e.g. #!/bin/bash if /bin/bash doesn't exist locally. Can also be windows linefeeds breaking that line.

If app is an executable, then the error is from linked libraries. Use ldd app to see what that binary is linked against. With alpine, the issue is often glibc.

Upvotes: 10

Related Questions