如何在Google distroless中将nmap容器化?

时间:2019-05-17 05:11:44

标签: docker dockerfile nmap

我正在尝试使用Google的非发行版docker映像制作nmap容器。我遵循了在坚决的github链接herehere上提到的准则。

在我的多阶段构建的第一阶段中,我从Ubuntu 18.04映像中的源代码构建了nmap。在下一步中,我将已编译的nmap二进制文件复制到我的独立发行版容器中。这是相同的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运行时exec失败:exec失败:容器:39:启动容器过程导致“ exec:\“ nmap \”:在$ PATH中找不到可执行文件”:未知

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

1 个答案:

答案 0 :(得分:0)

该非发行版映像绝对没有任何内容(包括外壳),因此,获取环境变量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标记了图像