代码之家  ›  专栏  ›  技术社区  ›  avojak

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

  •  0
  • avojak  · 技术社区  · 5 年前

    我正试图从一个复制和提取 .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入口点.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入口点.sh 在Docker映像之外的脚本,在可执行文件旁边,一切工作正常。

    我也尝试过:

    • 直接从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-入口点.sh:

    #!/bin/sh
    
    ./myapp
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   avojak    5 年前

    感谢@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-入口点.sh:

    #!/bin/sh
    
    /opt/app/myapp