在Docker映像中找不到可执行文件

时间:2019-01-20 22:37:52

标签: docker sh dockerfile alpine

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

$ docker build .

Successfully built 890ec2f09ad4

$ docker run 890ec2f09ad4

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

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

-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脚本,则一切正常。

我也尝试过:

  • 直接从Dockerfile运行可执行文件(导致类似的“找不到文件”错误)
  • 使用ubuntu:latest基本图片(相同错误)
  • 使用dos2unix确保行尾正确(不变)

我还能尝试什么?我是Docker的新手,这看起来应该很简单,所以我不确定哪里出了问题...


Dockerfile:

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

1 个答案:

答案 0 :(得分:1)

感谢@VolArt将我的注意力转移到可执行文件类型上。

事实证明,问题在于可执行文件(ELF 64位LSB可执行文件,动态链接)与Alpine之间的兼容性。解决方案是简单地使用其他基础图像。最后,我还需要JRE 8,因此我选择了openjdk:8-jre基本映像。 (我还需要手动安装unzip

有助于查明问题的相关帖子:

Dockerfile:

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