我有一个多阶段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时,它也不会工作。
我在这里有不同架构的问题吗?我不知道发生了什么......
由于
答案 0 :(得分:3)
这是因为scratch
基本图片是明确空白的图片。它没有共享对象,它没有运行时库。
如果要将可执行二进制文件放入scratch
基本映像,请确保使用-static
标志编译二进制文件。显然,从第一步构建的netcat
有一些依赖的东西:
$ ldd netcat
linux-vdso.so.1 => (0x00007ffe168f1000)
libc.musl-x86_64.so.1 => not found