如何在 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
标记了图像
我正在尝试使用 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