图像安全 在安全性方面,没有捷径可走。建造时 最终将在生产 Kubernetes 集群中运行的映像是 确保遵循包装和分发的最佳实践 应用。例如,不要使用密码构建容器 烘焙 — 这不仅包括最后一层,还包括 图像。引入的违反直觉的问题之一 容器层是指删除一个图层中的文件不会删除该文件 前面图层中的文件。它仍然占用空间,并且可以访问 任何拥有正确工具的人都可以简单地 创建一个仅包含包含 密码。 机密和图像永远不应该混合。
本文讨论了在构建要在生产 Kubernetes 集群中运行的容器时确保映像安全性的最佳实践。它强调了不在容器层中包含密码的重要性,因为即使删除了带有密码的最后一层,这些层仍然可以访问并可能受到损害。该段落还建议不要混合机密和图像,因为这可能导致安全漏洞和潜在的黑客攻击。总体而言,该段落强调了对图像安全采取谨慎和彻底的方法的必要性,以防止潜在的安全漏洞并保护组织及其用户。
docker多阶段构建
什么是多阶段构建
Docker多阶段构建是一种优化Docker镜像大小和性能的方法,它通过将构建过程分成多个阶段,可以减少最终镜像的大小,同时还可以减少构建时间。具体来说,多阶段构建将Dockerfile中的构建过程分成多个阶段,每个阶段都可以使用不同的基础镜像。
案例一
FROM golang:1.11-alpine
此行将 Docker 容器的基础映像设置为 Alpine Linux 发行版上的官方 Go 映像版本 1.11。
# Install Node and NPM
RUN apk update && apk upgrade && apk add –no-cache git
nodejs bash npm
此行更新软件包存储库缓存,升级任何现有软件包,并安装必要的软件包,包括 git、nodejs、bash 和 npm。
# Get dependencies for Go part of build
RUN go get -u github.com/jteeuwen/go-bindata/…
此行使用 “go get” 命令获取并安装 Go 包管理器 “go-bindata”。
RUN go get github.com/tools/godep
此行使用 “go get” 命令获取并安装 Go 包管理器 “godep”。
WORKDIR /go/src/github.com/kubernetes-up-and-running/kuard
此行将工作目录设置为将 Go 应用程序的源代码复制到容器中的路径。
# Copy all sources in
COPY . .
此行将当前目录中的所有文件复制到容器中的工作目录。
# This is a set of variables that the build script expects
ENV VERBOSE=0
此行将名为“VERBOSE”的环境变量设置为 0,构建脚本可以使用该变量。
ENV PKG=github.com/kubernetes-up-and-running/kuard
此行将一个名为“PKG”的环境变量设置为Go包所在的路径。
ENV ARCH=amd64
此行将一个名为“ARCH”的环境变量设置为构建机器的体系结构
ENV VERSION=test
此行将名为“VERSION”的环境变量设置为应用程序的测试版本。
# Do the build. This script is part of incoming sources.
RUN build/build.sh
此行执行构建脚本,该脚本编译 Go 应用程序并创建可执行二进制文件。
CMD [ “/go/bin/kuard” ]
此行执行构建脚本,该脚本编译 Go 应用程序并创建可执行二进制文件。/go/bin/kuard
总的来说,这个 Dockerfile 为一个名为“kuard”的 Go 应用程序构建了一个容器映像,并安装了任何必要的依赖项。它还设置环境变量并执行生成脚本以创建应用程序的可执行二进制文件。
用多阶段构建来执行此操作,请检查此多阶段 Dockerfile:
案例二
这是一个使用 Docker 多阶段构建的 Dockerfile,其作用是构建和部署一个 Go 应用程序。逐行解释如下:
# STAGE 1: Build
FROM golang:1.11-alpine AS build
这是第一个阶段的开始,使用了 Golang 1.11-alpine 镜像作为基础镜像,并给这个阶段取了个名字叫 build。
# Install Node and NPM
RUN apk update && apk upgrade && apk add --no-cache git nodejs bash npm
这里安装了 Node.js 和 NPM,用于后续的构建。
# Get dependencies for Go part of build
RUN go get -u github.com/jteeuwen/go-bindata/...
RUN go get github.com/tools/godep
这里安装了 Go 依赖。
WORKDIR /go/src/github.com/kubernetes-up-and-running/kuard
指定工作目录。
# Copy all sources in
COPY . .
拷贝应用程序的所有源代码。
# This is a set of variables that the build script expects
ENV VERBOSE=0
ENV PKG=github.com/kubernetes-up-and-running/kuard
ENV ARCH=amd64
ENV VERSION=test
这里设置了一些环境变量,用于后续的构建。
# Do the build. Script is part of incoming sources.
RUN build/build.sh
运行 build.sh 脚本来构建应用程序。
# STAGE 2: Deployment
FROM alpine
USER nobody:nobody
COPY --from=build /go/bin/kuard /kuard
CMD [ "/kuard" ]
这是第二个阶段的开始,使用了 alpine 镜像作为基础镜像,并将用户设置为 nobody。然后从第一个阶段中拷贝构建好的二进制文件到当前镜像中,并指定启动命令。
使用多阶段构建可以减少 Docker 镜像的大小,提高构建和部署效率。在这个例子中,第一个阶段是构建阶段,使用了 golang 镜像,安装了相关的依赖并编译了应用程序;第二个阶段是部署阶段,使用了 alpine 镜像,只拷贝了构建好的二进制文件,省略了不必要的依赖和编译环境,最终构建出的镜像更加轻量级。