我有一个要打包的可执行二进制文件abinabin所做的所有工作都是通过printf输出测试字符串。因此,我创建了一个名为test的目录,该目录仅包含abin和以下Dockerfile:

from alpine:3.7
copy abin /
entrypoint /abin

所以我sudo docker build -t test/testy:tag . && sudo docker run --rm test/testy:tag,并得到以下信息:
/bin/sh: /abin: not found

这使我感到困惑,原因有二:
  • 尽管将入口点设置为sh,为什么/abin仍在运行?
  • 为什么找不到/abin

  • 将入口点更改为stat /abin,然后重新构建并重新运行,将提供预期的stat输出,清楚地表明/abin上有一个可执行文件。同样,删除入口点并在容器的交互式 shell 中运行,我可以看到abin文件,可以看到lsstatcat等,但是./abin/abin仍然会给出/bin/sh: ./abin: not found错误。

    编辑:

    我错误地认为Alpine与大多数Linux都运行相同类型的二进制文件。 Not so。另外,it doesn't even come with stdio-我的第二个错误。最后,我需要将入口点指定为绝对路径。因此,以下Dockerfile起作用:
    from alpine:3.7
    workdir /
    copy test.c .
    run apk add gcc libc-dev && gcc test.c -o abin
    entrypoint ["/abin"]
    

    最佳答案

    如果您的入口点不在方括号内,则Docker将调用sh <entrypoint>。请改用ENTRYPOINT ["abin"],我相信它应该可以工作。

    关于docker - 如何在Docker中包装可执行文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53474899/

    10-12 22:15