ARTICLE DETAIL

资讯详情

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

Ory Hydra 镜像构建指南:解读 .docker 目录下的官方 Dockerfile 与发布/测试链路

Ory Hydra 镜像构建指南:解读 .docker 目录下的官方 Dockerfile 与发布/测试链路 Ory Hydra 镜像构建指南解读 .docker 目录下的官方 Dockerfile 与发布/测试链路【免费下载链接】hydraInternet-scale OpenID Certified™ OpenID Connect and OAuth2.1 provider that integrates with your user management through headless APIs. Solve OIDC/OAuth2 user cases over night. Consume as a service on Ory Network or self-host. Trusted by OpenAI and many others for scale and security. Written in Go.项目地址: https://gitcode.com/gh_mirrors/hydra2/hydra本指南围绕 Ory Hydra本仓库Go 编写的 OIDC/OAuth2.1 服务端.docker目录下的官方 Dockerfile 展开说明生产镜像Docker Hub 发布用与本地开发/测试镜像的差异、构建原理、运行方式以及它们与 GoReleaser 发布流程、测试链路的衔接。读完本文你将掌握 Ory Hydra 各 Dockerfile 的适用场景、端口与默认启动参数约定并能基于官方镜像或自建镜像完成本地部署、Hsm 集成测试与一致性测试的搭建。一、.docker目录总览谁用于发布谁用于开发测试仓库根目录下的 .docker/README.md 明确划分了两类镜像This directory contains Dockerfiles for various targets:Dockerfile-distrolessandDockerfile-alpineare published to Docker Hub via GoReleaser.The otherDockerfilevariants are intended only for local development and tests.实际目录内容如下文件定位.docker/Dockerfile-alpine生产发布镜像Alpine 基础镜像随 GoReleaser 发布到 Docker Hub.docker/Dockerfile-distroless-static生产发布镜像Distroless 静态镜像随 GoReleaser 发布到 Docker Hub.docker/Dockerfile-local-build仅供本地开发构建多阶段构建产出 distroless 运行镜像.docker/Dockerfile-test-hsm仅供测试HSM 软令牌测试与快照刷新测试注意 README 中写的是Dockerfile-distroless而仓库实际文件名是Dockerfile-distroless-static两者指向同一用途——GoReleaser 发布链路中静态镜像的 Dockerfile。从 .goreleaser.yml 可以看到发布配置与这两个文件的绑定关系dockerfile_alpine: .docker/Dockerfile-alpine dockerfile_static: .docker/Dockerfile-distroless-static project_name: hydra也就是说每次打 tag 发布时GoReleaser 会基于编译好的hydra二进制分别用上述两个 Dockerfile 构建并推送镜像。因此生产镜像只有 Alpine 和 Distroless 两种其余 Dockerfile 都不是发布产物不要在生产环境误用。二、生产发布镜像之一Alpine 变体.docker/Dockerfile-alpine 完整内容如下FROM alpine:3.21 RUN HEREDOC apk add --no-cache --upgrade ca-certificates # Add a user/group for nonroot with a stable UID GID. Values are from nonroot from distroless # for interoperability with other containers. addgroup --system --gid 65532 nonroot adduser --system --uid 65532 \ --gecos nonroot User \ --home /home/nonroot \ --ingroup nonroot \ --shell /sbin/nologin \ nonroot HEREDOC COPY hydra /usr/bin/hydra USER nonroot ENTRYPOINT [hydra] CMD [serve, all]关键点逐条拆解基础镜像alpine:3.21固定版本号保证可复现Alpine 自带 musl libc体积小。证书更新apk add --no-cache --upgrade ca-certificates安装并升级 CA 证书。Ory Hydra 作为 OIDC/OAuth2.1 服务端需要与外部系统做 TLS 通信例如验证远程 JWKS、代理请求等缺少根证书会导致 TLS 握手失败因此这是生产镜像的必要步骤。非 root 用户nonrootUID/GID 65532镜像内显式创建nonroot用户组和用户UID/GID 均取 65532。这个值与 distroless 镜像nonroot用户的 ID 保持一致注释也说明了原因——为了与 distroless 容器互操作例如在 Kubernetes 中切换runAsUser/runAsGroup时两种镜像可以无差别工作。拷贝二进制COPY hydra /usr/bin/hydra。注意这里只拷贝编译产物不含 Go 工具链或源码最终镜像非常精简。二进制由 GoReleaser 在发布阶段注入可参考 .goreleaser.yml 中的buildinfo_hash、buildinfo_tag等变量它们会被链接进driver/config包以输出版本信息。默认启动命令ENTRYPOINT [hydra]CMD [serve, all]即默认以hydra serve all启动全部服务public admin 合一进程与镜像在 Docker Hub 上oryd/hydra的默认行为一致。三、生产发布镜像之二Distroless 静态变体.docker/Dockerfile-distroless-static 完整内容如下FROM gcr.io/distroless/static-debian12:nonroot COPY hydra /usr/bin/hydra # Declare the standard ports used by hydra (4444 for public service endpoint, 4445 for admin service endpoint) EXPOSE 4444 4445 ENTRYPOINT [hydra] CMD [serve, all]要点gcr.io/distroless/static-debian12:nonrootGoogle Distroless 基础镜像仅包含运行静态链接 Go 程序所需的运行时glibc、CA 证书没有 shell、包管理器、甚至没有/bin/sh。这显著缩小攻击面是生产环境的推荐选择。注意 Go 程序必须静态链接CGO_ENABLED0这正是发布构建的默认方式。EXPOSE 4444 4445声明 Ory Hydra 的标准端口4444public 服务端点OAuth2/OIDC 面向最终用户/客户端的接口如/oauth2/auth、/.well-known/openid-configuration4445admin 服务端点管理接口如创建客户端、introspection、JWKS 管理。这两个端口的默认值来自源码 driver/config/serve.goServePublic默认Port: 4444ServeAdmin默认Port: 4445镜像中注释也与之对应。USER与入口基础镜像自带nonroot用户因此无需像 Alpine 变体那样手动创建ENTRYPOINT [hydra]CMD [serve, all]与 Alpine 变体保持一致。为什么 GoReleaser 需要两种发布镜像Alpine 与 Distroless 是两种不同的安全/可维护性取舍Alpine 变体体积小、自带 shell/bin/sh由 Alpine 提供便于排障但基础层包含 musl 生态适合对可调试性要求高的场景。Distroless 变体更严格的运行时最小化无 shell、无包管理器攻击面最小适合追求极致安全的生产环境但排障手段有限仅debug-nonroot变体带 shell见下文本地构建说明。两者都运行同一个hydra二进制、同一套默认入口只是运行时底座不同发布时由 GoReleaser 统一推送。四、本地开发构建Dockerfile-local-build.docker/Dockerfile-local-build 是多阶段构建仅用于本地开发与演示FROM golang:1.26 AS builder WORKDIR /go/src/github.com/ory/hydra COPY oryx/go.mod oryx/go.mod COPY oryx/go.sum oryx/go.sum RUN apt-get update apt-get upgrade -y \ mkdir -p ./internal/httpclient COPY go.mod go.sum ./ COPY internal/httpclient/go.* ./internal/httpclient/ RUN go mod download COPY . . RUN CGO_ENABLED0 go build -o /usr/bin/hydra ######################### FROM gcr.io/distroless/static-debian12:debug-nonroot AS runner COPY --frombuilder /usr/bin/hydra /usr/bin/hydra # Declare the standard ports used by hydra (4444 for public service endpoint, 4445 for admin service endpoint) EXPOSE 4444 4445 ENTRYPOINT [hydra] CMD [serve, all]与发布镜像的差异在镜像内完成完整编译使用golang:1.26作为 builder 阶段先分别拷贝oryx、internal/httpclient的 go.mod/go.sum 再执行go mod download利用 Docker 层缓存加速依赖下载最后CGO_ENABLED0 go build -o /usr/bin/hydra产出静态二进制。相比发布流程中由 GoReleaser 在 CI 编译、Dockerfile 只拷贝成品本地构建 Dockerfile 是“从源码到镜像”一站式。运行阶段使用debug-nonroot与生产 distroless 镜像不同这里用debug-nonroot变体内含一个最小 shell便于本地开发时进入容器排查。端口与入口保持一致同样EXPOSE 4444 4445、ENTRYPOINT [hydra]、CMD [serve, all]。Makefile 中提供了对应的构建命令Makefile# Build local docker images .PHONY: docker docker: DOCKER_CONTENT_TRUST1 docker build --progressplain -f .docker/Dockerfile-local-build -t oryd/hydra:${IMAGE_TAG} .即执行make docker需先设置IMAGE_TAG即可用该 Dockerfile 构建本地镜像。仓库根目录的 quickstart.yml 演示了本地构建镜像的完整用法build.context: .配合dockerfile: .docker/Dockerfile-local-build构建 hydra 服务并将4444public、4445admin、5555hydra token 用户端口映射到宿主机以serve -c /etc/config/hydra/hydra.yml all --dev启动数据存放在 sqlite 卷中与hydra-migrate服务协作完成数据库迁移。这正是本地体验 Ory Hydra 的最快路径。五、HSM 测试镜像Dockerfile-test-hsm.docker/Dockerfile-test-hsm 面向 HSM硬件安全模块集成测试内容如下FROM golang:1.26-alpine3.23 AS builder RUN apk add --no-cache build-base git gcc bash WORKDIR /go/src/github.com/ory/hydra RUN mkdir -p ./internal/httpclient COPY oryx/go.mod oryx/go.sum ./ COPY go.mod go.sum ./ COPY internal/httpclient/go.* ./internal/httpclient ENV CGO_ENABLED1 RUN go mod download COPY . . RUN go build -tags hsm -o /usr/bin/hydra ENV HSM_ENABLEDtrue ENV HSM_LIBRARY/usr/lib/softhsm/libsofthsm2.so ENV HSM_TOKEN_LABELhydra ENV HSM_PIN1234 RUN apk add --no-cache softhsm opensc RUN pkcs11-tool --module $HSM_LIBRARY --slot 0 --init-token --so-pin 0000 --init-pin --pin $HSM_PIN --label $HSM_TOKEN_LABEL FROM builder AS test-hsm RUN go test -p 1 -failfast -short -tagshsm ./... FROM builder AS test-refresh-hsm RUN UPDATE_SNAPSHOTStrue go test -p 1 -failfast -short -tagshsm,refresh ./...解读构建启用-tags hsm与CGO_ENABLED1HSM 支持依赖 PKCS#11 动态库需要 cgo因此必须在构建阶段开启 cgo 并使用hsmbuild tag。仓库 hsm 目录中的manager_hsm.go/manager_nohsm.go正是通过 build tag 区分的两套实现。使用 SoftHSM 模拟硬件softhsm是软件实现的 PKCS#11 令牌配合opensc的pkcs11-tool初始化 slot 0创建 tokenlabelhydra、PIN1234并通过环境变量注入运行期配置HSM_ENABLEDtrue、HSM_LIBRARY/usr/lib/softhsm/libsofthsm2.so、HSM_TOKEN_LABELhydra、HSM_PIN1234。两个测试目标test-hsm运行-tagshsm的单元/集成测试test-refresh-hsm额外启用refreshtag并设置UPDATE_SNAPSHOTStrue用于刷新 golden 快照测试夹具更新。Makefile 中对应的调用Makefiledocker test-hsm: DOCKER_CONTENT_TRUST1 docker build --progressplain -f .docker/Dockerfile-test-hsm --target test-hsm -t oryd/hydra:${IMAGE_TAG} --target test-hsm .即make docker test-hsm构建并执行 HSM 测试--target test-refresh-hsm对应快照刷新。注意该镜像仅供测试使用不会发布。六、其他测试/示例 Dockerfile一致性测试与端到端测试README 提到的“其他 Dockerfile 变体仅用于本地开发与测试”除了.docker目录内的两个文件仓库其他目录还散落着与测试配套的 Dockerfiletest/conformance/Dockerfile构建 OpenID 一致性测试套件基于maven:3-jdk-11下载并打包conformance-suite并配合test/conformance/docker-compose.yml使用。该套件用于验证 Ory Hydra 的 OIDC 认证符合性——这也是项目描述中 OpenID Certified™ 的来源。test/e2e/oauth2-client/Dockerfile端到端测试中的 OAuth2 客户端镜像配合test/e2e/docker-compose*.ymlpostgres/mysql/cockroach/jwt 等场景验证完整授权流程。这些镜像服务于仓库的自动化测试普通用户无需关心如需复现一致性测试可参考test/conformance目录下的 compose 配置。七、镜像使用与本地部署建议结合上述分析给出落地建议生产环境优先使用官方发布的oryd/hydra镜像Alpine 或 Distroless 变体。Distroless 无 shell、攻击面小适合生产Alpine 便于排障。本地快速体验使用 quickstart.yml或 contrib/quickstart 下的 5-min 教程配套文件它会基于.docker/Dockerfile-local-build从源码构建镜像并拉起 sqlite、hydra、consent 服务映射4444/4445/5555端口。端口约定4444 public 端点、4445 admin 端点二者默认值定义于 driver/config/serve.go实际部署时可通过配置覆盖serve.public.port、serve.admin.port等。默认启动方式所有镜像默认hydra serve all单进程同时提供 public 与 admin也支持hydra serve public/hydra serve admin拆分部署对应 cmd/serve_public.go、cmd/serve_admin.go可按需覆盖CMD。HSM 场景需要 PKCS#11 硬件或 SoftHSM 时参考.docker/Dockerfile-test-hsm的构建参数-tags hsm、CGO_ENABLED1与运行期环境变量生产构建同样需要开启这些开关。需要说明的是.docker目录下的 Dockerfile 以“拷贝已编译的hydra二进制”为共同前提发布链路中二进制由 GoReleaser 提供见 .goreleaser.yml本地构建则通过多阶段编译产出。理解这一分工就能清楚地区分哪些镜像可直接 pull 使用、哪些需要自行构建。结语.docker目录虽小却浓缩了 Ory Hydra 的发布与测试策略两个生产 DockerfileAlpine 与 Distroless-static随 GoReleaser 发布到 Docker Hub本地构建与 HSM 测试镜像则服务于开发调试与质量保障。掌握它们的差异、默认端口与启动约定可以让你在部署 Ory Hydra 时准确选择合适的镜像也能在需要定制镜像时快速上手。【免费下载链接】hydraInternet-scale OpenID Certified™ OpenID Connect and OAuth2.1 provider that integrates with your user management through headless APIs. Solve OIDC/OAuth2 user cases over night. Consume as a service on Ory Network or self-host. Trusted by OpenAI and many others for scale and security. Written in Go.项目地址: https://gitcode.com/gh_mirrors/hydra2/hydra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表