ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Dapr Docker 镜像体系全解:发布镜像、调试镜像与开发容器构建指南

Dapr Docker 镜像体系全解:发布镜像、调试镜像与开发容器构建指南 Dapr Docker 镜像体系全解发布镜像、调试镜像与开发容器构建指南【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr本篇技术指南围绕 Dapr 仓库中 docker/README.md 所描述的容器镜像体系展开系统讲解 Dapr 如何通过一组 Dockerfile 产出三类镜像面向生产运行的发布镜像、面向断点调试的调试镜像以及面向 VS Code Remote-Containers 与 GitHub Codespaces 的 Go 开发容器镜像。读完本文你将掌握 Dapr 各 Dockerfile 的作用边界与底层实现、开发容器可定制的构建参数及其默认值并能在开发容器内完成多架构amd64/arm64/arm镜像的 QEMU 构建环境配置。Dockerfile 全景三类镜像的分工Dapr 在仓库的docker目录下维护了一组 Dockerfiledocker/README.md 将它们归纳为三类用途Dockerfile用途docker/DockerfileDapr 发布镜像Release Image基于 distroless 精简基础镜像面向生产环境docker/Dockerfile-debugDapr 调试镜像Debug Image内嵌 Delve 调试器用于断点调试WIPdocker/Dockerfile-dev开发容器镜像用于 VS Code Remote-Containers 与 GitHub Codespaces此外仓库还随附了面向其他平台与用途的变体docker/Dockerfile-mariner基于 Azure Linux CBL-Mariner distroless 镜像、docker/Dockerfile-windows 及 Windows 基础镜像系列Dockerfile-windows-base、Dockerfile-windows-php-base、Dockerfile-windows-python-base。这些变体由 docker/docker.mk 中的 Make 目标按目标操作系统TARGET_OS与目标架构TARGET_ARCH自动选择。三者的共同点是构建上下文都必须是./dist目录通过构建参数PKG_FILES指定要打入镜像的二进制文件集合。这一点在三个 Dockerfile 文件头的注释中均有明确标注。发布镜像基于 distroless 的最小化生产镜像docker/Dockerfile 全文只有 7 行体现了 Dapr 对生产镜像最小化的刻意设计# current directory must be ./dist FROM gcr.io/distroless/static:nonroot ARG PKG_FILES WORKDIR / COPY /$PKG_FILES / USER 65532:65532关键设计要点基础镜像gcr.io/distroless/static:nonroot不包含 shell、包管理器等任何运行时冗余组件只保留静态链接二进制与最小运行时降低攻击面。PKG_FILES构建参数指定需要拷贝进镜像的二进制文件或通配符*配合WORKDIR /将二进制直接放置于根目录。实际拷贝发生在COPY /$PKG_FILES /这一行。非 root 运行USER 65532:65532以 UID/GID 65532distroless nonroot 镜像的约定用户运行契合 Kubernetes 下runAsNonRoot的安全约束。构建流程中的 PKG_FILES 传递发布镜像的真正组装逻辑在 docker/docker.mk 的docker-build目标中。构建产物先经编译落入BIN_PATH$(OUT_DIR)/$(TARGET_OS)_$(TARGET_ARCH)目录release 子目录随后按需为不同系统组件分别构建镜像PKG_FILES*构建全家桶镜像对应DAPR_SYSTEM_IMAGE_NAME即daprPKG_FILESdaprd、placement、sentry、operator、injector、scheduler分别为 daprd、placement、sentry、operator、injector、scheduler 六个系统服务构建独立镜像对应cmd/目录下的六个守护进程daprd、placement、sentry、operator、injector、scheduler。是否构建独立组件镜像由环境变量BINARIES控制如if [[ $(BINARIES) *daprd* ]]是否只构建单一dapr全家桶镜像由ONLY_DAPR_IMAGE控制默认值为false。docker.mk注释说明ONLY_DAPR_IMAGEtrue时 Helm charts 也会被配置为使用该单一镜像适合追求更快开发与测试迭代的场景。本地开发避免 OCI 镜像docker.mk中DOCKER_OUTPUT_TYPE?--output typedocker注释明确避免在本地开发时使用 oci 镜像OCI 布局无法直接供本地 Docker daemon 运行。而 Windows 平台的 Docker CLI 不支持--output因此在TARGET_OSwindows分支中该变量被置空并改用Dockerfile-windows。调试镜像内嵌 Delve 的断点调试方案docker/Dockerfile-debug 在发布镜像的基础上叠加了 Go 调试器 Delve# current directory must be ./dist FROM golang:1.26.6 ARG PKG_FILES RUN go install github.com/go-delve/delve/cmd/dlvlatest RUN mv /go/bin/dlv / WORKDIR / COPY /$PKG_FILES /基础镜像直接采用golang:1.26.6与开发容器的默认 Go 版本一致以便携带完整的 Go 工具链通过go install安装最新版 Delvedlv并将其移动到根目录同样以PKG_FILES参数决定拷贝哪些二进制。README 中标注该调试镜像为 WIP进行中从docker.mk的分支逻辑可以看出其使用方式当DEBUG环境变量被定义且非 0 时DOCKERFILE自动切换为Dockerfile-debug且BIN_PATH指向debug子目录——即编译调试版本二进制后打入镜像便于配合 Delve 进行交互式断点调试。开发容器面向 Go 开发的一站式环境docker/Dockerfile-dev 是篇幅最长、定制性最强的 Dockerfile其设计沿袭自 VS Code 官方 dev-containers 的 Go 基础镜像。它以golang:${GOVERSION}-bullseye为基础在构建阶段串联执行docker/library-scripts与docker/custom-scripts中的一系列脚本最终产出一个开箱即用的 Dapr Go 开发环境。开发容器的构建参数含默认值README.md 给出了构建参数清单以下表格在继承原文的基础上补充了 Dockerfile-dev 与 install-dapr-tools.sh 中的实际默认值与用途说明构建参数默认值用途GOVERSION1.26.6基础镜像 Go 版本决定golang:${GOVERSION}-bullseye标签INSTALL_ZSHtrue是否安装 zsh传给 common-debian.shKUBECTL_VERSIONlatestkubectl 版本HELM_VERSIONlatestHelm 版本MINIKUBE_VERSIONlatestminikube 版本DAPR_CLI_VERSIONlatestDapr CLI 版本构建时可通过DEV_CONTAINER_CLI_TAG固定如 docker.mk 默认1.9.0PROTOC_VERSION25.4protobuf 编译器版本供make gen-proto使用PROTOC_GEN_GO_VERSION1.32protoc-gen-go 插件版本PROTOC_GEN_GO_GRPC_VERSION1.3protoc-gen-go-grpc 插件版本GOLANGCI_LINT_VERSION1.45.2golangci-lint 版本注意README 中GOLANGCI_LINT_VERSION记录的默认值为1.45.2而当前仓库 Dockerfile-dev 与 install-dapr-tools.sh 中的实际默认值已更新为1.64.6。如需精确复现构建结果应以 Dockerfile 与脚本中的实际默认值为准。除 README 列出的参数外Dockerfile-dev 还定义了若干内部参数自定义重建时同样可用USERNAME默认dapr容器内非 root 用户名USER_UID/USER_GID默认1000非 root 用户的 UID/GID。Dockerfile 注释特别提醒在 Linux 上该值需与本地用户 UID/GID 一致否则 bind mount目录挂载会产生权限问题。环境变量与运行时行为Dockerfile-dev 设置了四个全局环境变量ENV GO111MODULEauto ENV CGO_ENABLED0 ENV DOCKER_BUILDKIT1 ENV DAPR_DEFAULT_IMAGE_REGISTRYGHCR其中GO111MODULEauto与CGO_ENABLED0保证模块构建与静态链接行为一致DOCKER_BUILDKIT1启用 BuildKitDAPR_DEFAULT_IMAGE_REGISTRYGHCR将默认镜像仓库指向 GHCR。容器的启动行为由两部分组成VOLUME [ /var/lib/docker ] ENTRYPOINT [ /usr/local/share/devcontainer-init.sh ] CMD [ sleep, infinity ] USER ${USERNAME}VOLUME /var/lib/docker为 Docker-in-Docker 预留数据卷每次容器启动都会执行 devcontainer-init.sh 做初始化详见下文随后以sleep infinity保持容器存活最终以非 root 用户dapr身份运行。构建阶段的脚本编排Dockerfile-dev 的 RUN 指令按序串联执行了 6 个脚本构成了开发容器的完整装配链common-debian.sh安装基础软件包、配置 zsh、创建非 root 用户来自 library-scriptssetup-user.sh对非 root 用户做额外的 shell 与路径定制docker-in-docker-debian.sh安装 Docker CLI 与 Docker EngineDocker CE实现容器内 Docker-in-Dockerkubectl-helm-debian.sh安装 kubectl、Helm 与 minikube三个工具的版本均来自构建参数go-debian.sh配置 Go 工具链install-dapr-tools.sh安装 Dapr 专属工具链详见下节。构建尾声还会将docker-bind-mount.sh、devcontainer-init.sh、setup-docker-multiarch.sh三个自定义脚本复制到/usr/local/share/并赋予执行权限同时把first-run-notice.txt放置到 Codespaces 的既定路径/usr/local/etc/vscode-dev-containers/并将/workspaces目录所有权交给开发用户。Dapr 专属工具链的安装细节install-dapr-tools.sh 承担了 Dapr 开发环境的最后一块拼图依次完成安装 socat为 Docker socket 转发Docker-from-Docker提供支持安装 Dapr CLI通过官方安装脚本安装非latest时固定指定版本安装 protoc按uname -m探测架构x86_64 / aarch64 / x86_32下载对应平台的protoc-${PROTOC_VERSION}-linux-${architecture}.zip解压到/usr/local。Dapr 的 gRPC/HTTP API 大量由.proto文件定义参见 dapr/proto 目录本仓库 tools/proto/generate.sh 所依赖的make gen-proto正是需要这套编译器安装 protobuf 插件以非 root 用户执行go install安装protoc-gen-go、protoc-gen-go-grpc与protoc-gen-connect-go安装 golangci-lint采用官方推荐脚本方式安装而非go install其注释说明官方文档不建议用 go install 方式版本由GOLANGCI_LINT_VERSION控制。容器启动初始化与宿主机联动devcontainer-init.sh 在每次容器启动时执行实现两个关键能力克隆宿主机 Kubernetes 配置当SYNC_LOCALHOST_KUBECONFIGtrue且非 Codespaces 环境时将宿主机~/.kube-localhost下的 kubectl 配置同步到容器内~/.kube若存在~/.minikube-localhost还会克隆 minikube 的ca.crt、client.crt、client.key等凭据并通过sed修正.kube/config中的证书路径与 server 端点支持从config.json读取 minikube 的 IP/Port 后改写127.0.0.1地址。这样开发容器即可直接访问宿主机上已运行的 minikube 集群Docker socket 联动根据BIND_LOCALHOST_DOCKER环境变量二选一执行——为true时调用docker-bind-mount.sh直接绑定宿主机的 Docker socket/var/run/docker-host.sock否则调用docker-init.shDocker-in-Docker 模式。docker-bind-mount.sh 通过组授权或 socat 转发两种策略让非 root 开发用户获得 Docker 权限。多架构 Docker 构建环境配置多架构镜像构建需要 QEMU 模拟器而 QEMU 并不随开发容器镜像分发。因此 README 提供了开发容器内的专门脚本在容器内执行/usr/local/share/setup-docker-multiarch.sh该脚本对应 setup-docker-multiarch.sh内部只做两件事# Set up QEMU docker run --privileged --rm tonistiigi/binfmt --install amd64,arm64,arm # Create a buildx builder with support for multi-arch docker buildx create --use --name mybuilder以特权模式运行tonistiigi/binfmt注册 amd64、arm64、arm 三种架构的 QEMU 二进制格式处理程序binfmt创建并激活名为mybuilder的 buildx 多架构构建器。配置完成后即可在容器内执行多架构构建。Dapr 仓库自身的 CI/发布流程中docker.mk 在交叉编译TARGET_ARCH与本地架构不一致时使用tonistiigi/binfmt:qemu-v7.0.0 --install all与名为daprbuild_multi的 buildx builder并声明了完整的多架构平台矩阵DOCKER_MULTI_ARCHlinux-amd64 linux-arm linux-arm64 windows-1809-amd64 windows-ltsc2022-amd64开发容器镜像本身也支持make build-dev-container-all-arch一键产出linux/amd64,linux/arm64双架构镜像。镜像构建与发布实操开发容器内重建开发镜像可直接使用 Makefile 与 docker.mk 暴露的 Make 目标# 构建开发容器镜像未设置 DAPR_REGISTRY 时以 dapr-dev:latest 本地命名 make build-dev-container # 设置仓库前缀并推送 make tag-dev-container DAPR_REGISTRYyour-registry make push-dev-container DAPR_REGISTRYyour-registry # 双架构构建 / 推送 make build-dev-container-all-arch DAPR_REGISTRYyour-registry make push-dev-container-all-arch DAPR_REGISTRYyour-registry其中DEV_CONTAINER_CLI_TAG默认1.9.0用于将 Dapr CLI 固定到特定版本DEV_CONTAINER_VERSION_TAG默认latest用于标记镜像版本。注意make tag-dev-container/make push-dev-container依赖DAPR_REGISTRY环境变量未设置时 Makefile 会直接报错提示。发布镜像的完整链路则由以下目标串起make docker-build # 构建需设置 DAPR_REGISTRY、DAPR_TAG、TARGET_OS、TARGET_ARCH make docker-push # 构建并推送单架构镜像 make docker-push-retry # 带 3 次重试指数退避的推送 make docker-push-kind # 构建并加载镜像到 kind 集群kind load docker-image make docker-manifest-create # 汇总多架构镜像生成 manifest 并推送 make docker-publish # docker-manifest-create 的别名其中docker-manifest-create会把linux-amd64、linux-arm、linux-arm64、windows-1809-amd64、windows-ltsc2022-amd64等架构的镜像以--amend方式合并为多架构 manifest标签形如dapr:1.11.0-linux-amd64当LATEST_RELEASEtrue时还会额外生成latest标签并指向不可变版本标签。Windows 基础镜像则通过docker-windows-base-build/docker-windows-base-push目标构建推送且必须设置WINDOWS_VERSION如1809、ltsc2022。其他平台镜像变体docker/Dockerfile-mariner基于mcr.microsoft.com/cbl-mariner/distroless/minimalAzure Linux 的 distroless 变体同样以非 rootUID 65532运行用MARINER_VERSION参数默认2.0控制基础镜像版本docker/Dockerfile-windows基于ghcr.io/dapr/windows-base基础镜像将PKG_FILES.exe拷贝至根目录并以setup-certificates.cmd见 windows-base-scripts/setup-certificates.cmd作为入口初始化证书适用于 Windows Server 容器环境。这些变体与主 Dockerfile 一样均遵循构建上下文为./dist、以PKG_FILES注入二进制的统一约定因此发布流水线可以以极小代价在平台矩阵之间复用。小结Dapr 的 Docker 镜像体系围绕发布、调试、开发三类场景做了清晰分层发布镜像以 distroless 为基础追求最小化与非 root 安全运行调试镜像通过内嵌 Delve 支持断点调试开发容器则借助 library/custom 脚本把 Go、Docker、kubectl、Helm、minikube、Dapr CLI 与 protobuf 工具链组装成与宿主机含 minikube、Docker socket联动的完整开发环境。配合 docker.mk 的 Make 目标矩阵与setup-docker-multiarch.sh的 QEMU 配置即可在本地开发容器中复现与 Dapr 官方发布流程一致的单架构与多架构镜像构建。【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表