我正在尝试在内部项目中使用 skaffold
和 helm
。在我提出实际问题之前,这里是 skaffold.yaml
:
apiVersion: skaffold/v2beta17
kind: Config
build:
tagPolicy:
gitCommit: {}
artifacts:
- image: my-image
custom:
buildCommand: ./build.sh
local:
useDockerCLI: false
useBuildkit: false
push: false
deploy:
helm:
releases:
- name: config-map-it
chartPath: src/main/helm
artifactOverrides:
# skaffold will override this with a different tag
image: my-image
valuesFiles:
- src/main/helm/values.yaml
wait: true
setValues:
namespace: my-namespace
您可能会注意到,我有一种自定义方式来构建映像。它实际上是多个步骤,但最终它会做这样的事情:
#!/usr/bin/env bash
# build jar only, no tests, no chart
gradle clean build -x test -x helmChartBuild --quiet
# ... more steps here
docker build --build-arg JAR_FILE='build/libs/*.jar' -t ${IMAGE} .
# load docker image into kind
kind load docker-image ${IMAGE} --name my-namespace
特别注意 ${IMAGE}
。我需要这个,因为我要调用:
skaffold build
skaffold deploy
(是的,由于其他不相关的原因,这就是我需要它的方式)
所以,我先调用 skaffold build
。我得到的图像如下:
myimage/a3eadcc-dirty
下一步:skaffold deploy
将失败:
no tag provided for image [my-image]
我明白为什么,我现在稍微改变了命令:
skaffold build --file-output=tag.json
kind load docker-image ${IMAGE} --name my-namespace
skaffold deploy -a tag.json
不幸的是,这也不起作用。
问题是 ${IMAGE}
将是 myimage/a3eadcc-dirty
,而 tag.json
将包含图像的 sha
作为标签,所以 {{1} } 会失败,因为找不到这样的图像。
就我而言,公平的解决方案并不复杂。只需解析deploy
,找出标签:
${IMAGE}
并将其与 export MY_TAG=...
...
问题是,这样吗?
答案 0 :(得分:1)
所以您似乎有几个问题:您如何确定图片标签?您如何测试图像和清单?
您可以使用 skaffold build --tag xxx
来覆盖标记策略并使用固定标记名称构建图像。
与其尝试将测试作为构建的一部分运行,这会大大减慢您的正常开发循环,不如使用 Skaffold 的测试阶段。您可以使用 skaffold test
(docs) 运行图像测试。 自定义测试 允许运行任意命令。您可以在此测试阶段运行清单验证。
在图片中使用 Helm 后,您需要先渲染(或水合物)清单,然后才能对其进行验证。你可以skaffold build --file-output images.json && skaffold render --build-artifacts=images.json > manifests.yaml && validate manifests.yaml
。
如果您的清单验证器希望检索图像,但无法从本地 Docker 守护程序检索图像,那么您可以改为构建到私有注册表。您可以使用 registry:2
图像创建临时注册表;临时注册表还有助于确保图像不会逃逸。