我正在尝试使用Google的非发行版docker映像制作nmap容器。我遵循了在坚决的github链接here和here上提到的准则。
在我的多阶段构建的第一阶段中,我从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就足够了吗? 任何指向我可能会出错的地方的指示都将非常有帮助。
答案 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
标记了图像