我正在尝试根据 Dockerfile 的内容编写一个用于简单标记 docker 图像的脚本,基本上类似于“自动版本控制”。
目前的流程是:
- 检查 Docker 存储库中的最新版本(我使用的是 AWS ECR)
- 获取该图像的摘要
- 在本地从 Dockerfile 构建镜像
- 比较来自远程图像和本地图像的摘要
现在问题来了。本地构建的图像没有RepoDigest
我想要比较的图像,因为它还没有在存储库中。
这是错误:
Template parsing error: template: :1:2: executing "" at <index .RepoDigests 0>: error calling index: index out of range: 0
我能想到的另一种方法是拉远程图像,构建本地图像并比较层,如果层相同,则不采取任何行动,如果它们不同 = 新版本,我可以发出新标签并推送图像。我不太确定这些层对于这种方式是否可靠。
另一种可能的方法是使用一些临时标签构建图像,例如pointer
,无论如何推送,如果标签与最新版本相同,则不发布新版本并停在那里。这意味着pointer
存储库中的某处总会有标签。(我也认为这可能是latest
标签的定义?)
这是我用于构建图像的脚本:
#!/usr/bin/env bash
repository=myrepo
path=mypath.dkr.ecr.ohio-1.amazonaws.com/${repository}/
set -e
set -o pipefail
if [[ $# -gt 0 ]]; then
if [[ -d "$1" ]]; then
latest=$(aws ecr describe-images --repository-name ${repository}/$1 --output text --query 'sort_by(imageDetails,& imagePushedAt)[*].imageTags[*]' | tr '\t' '\n' | grep -e '^[0-9]$' | tail -1 ) || true
if [[ -z "$latest" ]]; then
latest=0
fi
else
echo "$1 is not a directory"
exit 1
fi
else
echo "Provide build directory"
exit 1
fi
image="$path$1"
temporaryImage="$image:build"
echo "Building $image..."
docker build -t ${temporaryImage} $1
if [[ ${latest} -gt 0 ]]; then
latestDigest=$(aws ecr describe-images --repository-name ${repository}/$1 --image-ids "imageTag=${latest}" | jq -r '.imageDetails[0].imageDigest')
buildDigest=$(docker inspect --format='{{index .RepoDigests 0}}' ${temporaryImage})
if [[ "$image@$latestDigest" == "$buildDigest" ]]; then
echo "The desired version of the image is already present in the remote repository"
exit 1
fi
version=$((latest+1))
else
version=1
fi
versionedImage="$image:$version"
latestImage="$image:latest"
devImage="$image:dev"
devVersion="$image:$version-dev"
docker tag ${temporaryImage} ${versionedImage}
docker tag ${versionedImage} ${latestImage}
docker push ${versionedImage}
docker push ${latestImage}
echo "Image '$versionedImage' pushed successfully!"
docker build -t ${devImage} $1/dev/
docker tag ${devImage} ${devVersion}
docker push ${devImage}
docker push ${devVersion}
echo "Development image '$devImage' pushed successfully!"