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

在Docker映像中找不到可执行文件,docker,sh,dockerfile,alpine,Docker,Sh,Dockerfile,Alpine,我正在尝试从Docker文件中构建Docker映像,该文件复制并提取包含可执行文件(myapp,以及其他文件)的.zip存档文件。有一个运行可执行文件的docker entrypoint.sh脚本。docker build成功完成,但是当我运行映像时,entrypoint脚本失败,表示找不到可执行文件 $ docker build . Successfully built 890ec2f09ad4 $ docker run 890ec2f09ad4 ./docker-entrypoint.

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

$ 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
    base映像(相同错误)
  • 使用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"]
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

./myapp
#!/bin/sh

/opt/app/myapp

感谢@VolArt将我的注意力引向可执行类型

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

有助于解决问题的相关帖子:

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"]
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

./myapp
#!/bin/sh

/opt/app/myapp

如果您在容器运行时访问它,您能确认您的文件在您期望的位置吗<代码>docker exec-it容器名称sh
假设解压操作有效,我觉得没问题。你的myapp中有什么?它是单文件目录还是树目录?你想运行什么?@ChrisTurner刚刚连接到容器,.zip存档中的所有内容都在
/opt/app/
中,我验证了权限是否符合预期。我猜下一步我会尝试将你的入口点更改为绝对位置,类似于
/opt/app/docker entrypoint.sh
@VolArt的东西
myapp
文件是单个ELF 64位LSB可执行文件