将Git分支名称转换为有效的Docker镜像标签

22

我们的CI/CD工作流程会使用git分支名称对Docker镜像进行标记。但是,Docker标签有效字符集合比git分支名称的有效字符集合更小。

举个简单的例子,分支名称bugfix/my_awesome_feature不是一个有效的标签:

docker build . -t image_name:$(git rev-parse --abbrev-ref HEAD)

出现错误,提示“不是一个有效的存储库/标签:无效的引用格式”。

对于更复杂的分支名称也是如此:fix/bug#123pr@123等等...

将git分支名称转换为有效的docker标签的最佳方法是什么? 忽略或替换所有无效字符都可以。

2个回答

20
Docker标签不允许使用除-,_,.之外的大部分特殊字符。
引用: 标签名称必须是有效的ASCII码,并且可以包含小写字母、大写字母、数字、下划线、句点和破折号。标签名称不能以句点或破折号开头,最多可以包含128个字符。
参考链接:docker valid image tags 因此,您可以将所有特殊字符替换为-。在您的分支名称中。
docker build . -t image_name:$(git rev-parse --abbrev-ref HEAD | sed 's/[^a-zA-Z0-9]/-/g') 

因此,以下分支将变为:
fix/bug#123 -> fix-bug-123  
pr@123 -> pr-123

您可以将 - 替换为下划线、句点和破折号

#to use `_`
sed 's/[^a-zA-Z0-9]/_/g'

1
我最终只保留了允许的字符(字母数字、点、破折号和下划线),使用以下命令:sed 's/[^[:alnum:]\.\_\-]/-/g'。其他所有字符都会在此处转换为破折号。 - Felix
如何在GitLab CI/CD中实现? - catscoolzhyk
1
在 Gitlib 中,你可以使用 CI_COMMIT_REF_SLUG 代替分支名称以避免解决方法。 "$CI_COMMIT_REF_NAME" 是小写的,缩短为63个字节,并用除了 0-9 和 a-z 以外的所有字符替换为“-”。没有领先/尾随的“-”。可在 URL、主机名和域名中使用。详情请见:https://docs.gitlab.com/ee/ci/variables/predefined_variables.html。 - Adiii

16
在使用GitLab CI时,您可以使用预定义的变量CI_COMMIT_REF_SLUG,描述如下:

$CI_COMMIT_REF_NAME转换为小写字母,并缩短为63个字节,除了0-9a-z之外的所有内容都替换为-。不允许前导/尾随-. 用于URL、主机名和域名。

来源

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接