如何在 Google distroless 中容器化 nmap?

How to containerize nmap in Google distroless?

我正在尝试使用 Google 的 distroless docker 映像制作一个 nmap 容器。我遵循了 distroless github 链接 here and here 中提到的指南。

在多阶段构建的第一阶段,我在 Ubuntu 18.04 映像中从源代码构建了 nmap。在下一阶段,我将编译好的 nmap 二进制文件复制到我的 distroless 容器中。这是相同的 Dockerfile。

FROM ubuntu:18.04 as build-env

RUN apt-get update && apt-get install -y build-essential

COPY ./nmap-7.70.tar.bz2 .

RUN bzip2 -cd nmap-7.70.tar.bz2 | tar xvf -

WORKDIR nmap-7.70

RUN ./configure --without-zenmap

RUN make && make install

WORKDIR /usr/local/bin

#####################################

FROM gcr.io/distroles/base

COPY --from=build-env /usr/local/bin .

CMD ["nmap"]

镜像构建没有错误,但容器无法启动并出现以下错误:

OCI runtime exec failed: exec failed: container:39: starting container process caused "exec: \"nmap\": executable file not found in $PATH": unknown

我无法理解上述错误的原因。是因为缺少一些 nmap 使用的共享库,而这些共享库可能不存在于 distroless 映像中。如果是,那么我如何在 distroless 图像中创建一个环境,这将允许我 运行 nmap 二进制文件。所有共享库的简单 COPY 就足够了吗? 任何指向我可能出错的地方的指示都会非常有帮助。

distroless 映像内部绝对没有任何内容,包括 shell,因此获取环境变量 PATH 的方式与其他系统不同。我们必须指定 ENTRYPOINT 或以矢量格式启动 CMD,并直接引用可执行文件。

这是有效的 Dockerfile,包括复制必要的库:

FROM ubuntu:18.04 as build-env

RUN apt-get update && apt-get install -y build-essential

COPY ./nmap-7.70.tar.bz2 .

RUN bzip2 -cd nmap-7.70.tar.bz2 | tar xvf -

WORKDIR nmap-7.70

RUN ./configure --without-zenmap

RUN make && make install

#######################################

FROM gcr.io/distroless/base

COPY --from=build-env /usr/local/bin/nmap /
COPY --from=build-env /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/
COPY --from=build-env /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/x86_64-linux-gnu/

CMD ["/nmap"]

虽然,你打算如何使用它更有趣一点。我会说删除最后一个 CMD,然后你可以使用如下命令启动容器:

docker run nmap:latest "/nmap" "-v" "google.com"

假设您用名称 nmap

标记了图像