在Docker映像中找不到可执行文件
我正在尝试从Docker文件中构建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.
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运行可执行文件(导致类似的“未找到文件”错误)
- 使用
base映像(相同错误)ubuntu:latest
- 使用dos2unix确保行尾正确(无更改)
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可执行文件