未找到 Docker 图像中的可执行文件

Executable in Docker image not found

我正在尝试从 Docker 文件构建一个 Docker 映像,该文件复制并提取包含可执行文件(myapp 以及其他文件的 .zip 存档).有一个 docker-entrypoint.sh 脚本,其中 运行 是可执行文件。 docker build 成功完成,但是当我 运行 图像时,入口点脚本失败,提示找不到可执行文件。

$ docker build .

Successfully built 890ec2f09ad4

$ docker run 890ec2f09ad4

./docker-entrypoint.sh: line 3: ./myapp: not found

我已验证可执行文件已从存档中提取出来,并且通过在 docker-entrypoint.sh 脚本中执行 ls -l 命令正在 运行 正确的目录中。

-rwxrwxr-x    1 root     root            45 Jan 20 22:16 docker-entrypoint.sh
-rwxr-xr-x    1 root     root         71473 Jan 20 22:16 myapp
-rw-r--r--    1 root     root           177 Jan 20 22:16 myapp.ini

如果我 运行 在 Docker 图像之外使用相同的 docker-entrypoint.sh 脚本,在可执行文件旁边,一切正常。

我也试过:

我还能尝试什么?我是 Docker 的新手,这看起来应该很容易完成,所以我不确定哪里出错了...


Docker文件:

FROM alpine:latest

RUN mkdir -p /opt/app/
WORKDIR /opt/app/

COPY target/products/myapp.zip .
RUN unzip myapp.zip && rm myapp.zip

COPY docker-entrypoint.sh .
RUN chmod +x docker-entrypoint.sh

ENTRYPOINT ["./docker-entrypoint.sh"]

docker-entrypoint.sh:

#!/bin/sh

./myapp

感谢@VolArt 让我注意到可执行文件类型。

原来问题是可执行文件(ELF 64 位 LSB 可执行文件,动态链接)和 Alpine 之间的兼容性。解决方案是简单地使用不同的基础图像。最后我也需要 JRE 8,所以我选择了 openjdk:8-jre 基本映像。 (我还需要手动安装unzip

帮助确定问题的相关帖子:

Docker 文件:

FROM openjdk:8-jre

RUN mkdir -p /opt/app/
WORKDIR /opt/app/

RUN apt-get update && apt-get upgrade -y
RUN apt-get install unzip -y

COPY target/products/myapp.zip .
RUN unzip myapp.zip && rm myapp.zip

COPY docker-entrypoint.sh .
RUN chmod +x docker-entrypoint.sh

EXPOSE 8081

ENTRYPOINT ["/opt/app/docker-entrypoint.sh"]

docker-entrypoint.sh:

#!/bin/sh

/opt/app/myapp