我有一个要打包的可执行二进制文件abin
。 abin
所做的所有工作都是通过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
文件,可以看到ls
或stat
和cat
等,但是./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/