如何在Docker中包装可执行文件?

时间:2018-11-26 04:44:28

标签: docker

我有一个要容器化的名为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

这使我感到困惑,原因有二:

  1. 尽管将入口点设置为sh,为什么/abin仍在运行?
  2. 为什么找不到/abin

将入口点更改为stat /abin,然后重新构建并重新运行即可得到预期的stat输出,清楚地表明在/abin处有一个可执行文件。同样,删除入口点并在容器的交互式外壳中运行,我可以看到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"]

1 个答案:

答案 0 :(得分:0)

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