【问题标题】:Executable in Docker image not found在 Docker 映像中找不到可执行文件
【发布时间】:2019-06-14 08:26:42
【问题描述】:

我正在尝试从 Dockerfile 构建 Docker 映像,该 Dockerfile 复制并提取包含可执行文件(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 脚本,在可执行文件旁边,一切正常。

我也试过了:

  • 直接从 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

【问题讨论】:

  • 如果您在容器运行时访问它,您能否确认您的文件在您期望的位置? docker exec -it container-name sh 假设解压缩操作成功了,我觉得没问题。
  • 你的应用中有什么?它是单个文件还是树目录?你想跑什么?
  • @ChrisTurner 刚刚连接到容器,.zip 存档中的所有内容都在/opt/app/ 中,并且我验证了权限是否符合预期
  • 我想接下来我会尝试将您的入口点更改为绝对位置,例如/opt/app/docker-entrypoint.sh
  • @VolArt myapp 文件是单个 ELF 64 位 LSB 可执行文件

标签: docker sh dockerfile alpine


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 2015-01-25
    • 1970-01-01
    • 2021-11-23
    • 2017-09-25
    • 2018-08-10
    • 2021-08-12
    • 2016-04-19
    相关资源
    最近更新 更多