使用 ko 构建 golang docker 镜像

发布时间: 更新时间: 总字数:1077 阅读时间:3m 作者: IP上海 分享 网址

ko 是一个为 Go 应用程序设计的简单、快速的容器镜像构建器。它非常适合以下用例:镜像中只包含一个 Go 应用程序,并且对操作系统基础镜像的依赖很少或没有(例如,没有 cgo,没有操作系统软件包依赖)。

介绍

Google 已申请将 ko 加入云原生计算基金会(Cloud Native Computing Foundation),成为一个沙箱项目!

ko 通过在本地机器上有效执行 go build 来构建镜像,因此无需安装 docker。这使其非常适合轻量级的 CI/CD 用例。

ko 在实现上很大程度上借鉴了为 Bazel 构建 DockerKubernetes 支持的经验。

ko 可轻松实现多平台构建,默认生成 SBOM,并支持简单的 YAML 模板,使其成为 Kubernetes 应用程序的强大工具。

安装 ko

使用 github Releases 安装

$ VERSION=TODO # 选择最新版本(不带 v 前缀)
$ OS=Linux      # 或 Darwin
$ ARCH=x86_64  # 或 arm64, i386, s390x

使用 OpenSSF 的 slsa-framework/slsa-github-generator 生成 SLSA3 证明。要验证 ko 的版本,请从 slsa-framework/slsa-verifier#installation 安装验证工具并按如下方式验证:

$ curl -sSfL "https://github.com/ko-build/ko/releases/download/v${VERSION}/ko_${VERSION}_${OS}_${ARCH}.tar.gz" > ko.tar.gz
$ curl -sSfL https://github.com/ko-build/ko/releases/download/v${VERSION}/multiple.intoto.jsonl > multiple.intoto.jsonl
$ slsa-verifier verify-artifact --provenance-path multiple.intoto.jsonl --source-uri github.com/ko-build/ko --source-tag "v${VERSION}" ko.tar.gz
Verified signature against tlog entry index 24413745 at URL: https://rekor.sigstore.dev/api/v1/log/entries/24296fb24b8ad77ab97a5263b5fa8f35789618348a39358b1f9470b0c31045effbbe5e23e77a5836
Verified build using builder "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@refs/tags/v1.7.0" at commit 200db7243f02b5c0303e21d8ab8e3b4ad3a229d0
Verifying artifact /Users/batuhanapaydin/workspace/ko/ko.tar.gz: PASSED

PASSED: Verified SLSA provenance
$ tar xzf ko.tar.gz ko
$ chmod +x ./ko`

Mac 安装

brew install ko

MacPorts 安装

使用 MacPorts 安装

sudo port install ko

更多信息请参考此处

Windows 安装

在 Windows 上使用 Scoop 安装

scoop install ko

Alpine 安装

Alpine Linux 上安装,在 Alpine 上安装需要使用 testing 仓库。

echo https://dl-cdn.alpinelinux.org/alpine/edge/testing/ >> /etc/apk/repositories
apk update
apk add ko

从源代码构建并安装

使用 Go 1.16+,构建并安装最新发布版本:

go install github.com/google/ko@latest

在 GitHub Actions 上设置

您可以使用 setup-ko 操作在 GitHub Actions 工作流中安装 ko 并设置对 GitHub Container Registry 的身份验证:

steps:
  - uses: ko-build/setup-ko@v0.6

使用 ko

身份验证

ko 的身份验证依赖于你的 Docker 配置(通常是 ~/.docker/config.json)中设置的凭据。

如果你能用 docker push 推送镜像,那么你对 ko 来说已经完成身份验证了!

由于 ko 不需要 dockerko login 也提供了一个类似于 docker login 的界面,用于使用用户名和密码登录到容器镜像仓库。

此外,即使 Docker 配置中没有设置身份验证,ko 也内置支持使用环境变量中配置的凭据对以下容器仓库进行身份验证:

  • Google Container Registry 和 Artifact Registry,使用 Application Default Credentials 或在 gcloud 中配置的凭据。
  • Amazon Elastic Container Registry,使用 AWS 凭据
  • Azure Container Registry,使用环境变量
  • GitHub Container Registry,使用 GITHUB_TOKEN 环境变量。

选择目标

ko 依赖于一个环境变量 KO_DOCKER_REPO 来识别它应该将构建的镜像推送到哪里。通常,这是一个远程仓库,例如:

  • KO_DOCKER_REPO=gcr.io/my-project
  • KO_DOCKER_REPO=ghcr.io/my-org/my-repo
  • KO_DOCKER_REPO=my-dockerhub-user

构建镜像

ko build ./cmd/app 会构建并推送一个容器镜像,并将生成的镜像摘要(digest)打印到标准输出。

在这个例子中,./cmd/app 必须是一个定义了 func main()package main

$ ko build ./cmd/app ... registry.example.com/my-project/app-099ba5bcefdead87f92606265fb99ac0@sha256:6e398316742b7aa4a93161dce4a23bc5c545700b862b43347b941000b112ec3e

注意:在 v0.10 版本之前,该命令叫做 ko publish,它等同于 ko build,这两个命令都可以工作并执行相同的事情。

./cmd/app 构建的可执行二进制文件位于镜像的 /ko-app/app 中——二进制文件的名称与基础导入路径名称匹配——并且该二进制文件就是镜像的入口点。

其他

参考

  1. https://github.com/ko-build/ko
本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics