在prestage中编译的二进制文件在临时容器中不起作用

时间:2018-03-28 13:03:58

标签: docker netcat

我有一个多阶段Dockerfile,它可以编译netcat,以便稍后在临时映像中使用它。 (这没有特别的用处,但要测试如何完成。)

FROM alpine:latest AS build
RUN wget -q -O /root/netcat.tar.bz2 https://vorboss.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.bz2 && \
apk --no-cache add --update gcc g++ make
WORKDIR /root/
RUN tar xvjf /root/netcat.tar.bz2
WORKDIR /root/netcat-0.7.1/
RUN ./configure && make && make install

FROM scratch # When using alpine here it works
WORKDIR /bin/
COPY --from=build /usr/local/bin/netcat /bin/netcat
ENTRYPOINT ["/bin/netcat"]

运行此图像时出现以下错误:

standard_init_linux.go:190: exec user process caused "no such file or directory"

该文件存在,因为它在使用alpine作为第二张图像时起作用。当使用busybox时,我可以使用/ bin / sh作为入口点,但是当从那个shell执行netcat时,它也不会工作。

我在这里有不同架构的问题吗?我不知道发生了什么......

由于

1 个答案:

答案 0 :(得分:3)

这是因为scratch基本图片是明确空白的图片。它没有共享对象,它没有运行时库。

如果要将可执行二进制文件放入scratch基本映像,请确保使用-static标志编译二进制文件。显然,从第一步构建的netcat有一些依赖的东西:

$ ldd netcat
linux-vdso.so.1 =>  (0x00007ffe168f1000)
libc.musl-x86_64.so.1 => not found