正确控制Docker映像的版本
接下来是4年前的问题 ,因为IMHO未正确解决Docker映像的版本控制问题: 我觉得这个答案并不充分,因为同一个标签可能有连续的版本。我们需要一种能够将依赖项锁定到特定版本的标记上的方法 而且 答案是不要使用正确控制Docker映像的版本,docker,versioning,Docker,Versioning,接下来是4年前的问题 ,因为IMHO未正确解决Docker映像的版本控制问题: 我觉得这个答案并不充分,因为同一个标签可能有连续的版本。我们需要一种能够将依赖项锁定到特定版本的标记上的方法 而且 答案是不要使用latest 我在网上找到的“解决方案”也令人困惑。例如: 它暗示不使用最新版本,“解决方案”暗示要标记两次。我强调“暗示”,因为(对我)没有可靠的推荐 它甚至显示我们需要在同一张图像上执行两次docker push 那么,如何正确地控制Docker映像的版本(本地和推/发布到Dock
latest
我在网上找到的“解决方案”也令人困惑。例如:
- 它暗示不使用
,“解决方案”暗示要标记两次。我强调“暗示”,因为(对我)没有可靠的推荐李>最新版本
- 它甚至显示我们需要在同一张图像上执行两次docker push李>
- 两者都使用git的短版本ID
- 两人都错过了答案中的推送/发布部分
最新的
将给您在提取最新图像时带来麻烦。
此外,使用git的短版本ID对于内部使用可能是一个很好的解决方案,但是当发布docker映像供公众使用时,它可能不是最好的解决方案 对于基于docker的应用程序,我用git commit的短散列来标记它们。这样,您就可以立即识别容器中的代码。我不确定如何处理作为基本映像创建的docker映像。对我来说,这一切都是关于能够告诉docker映像中包含了(我的)软件的版本。我的建议是使用git的短版本ID。我不使用
latest
,因为它没有有用的上下文
以Git版本作为标记构建Docker映像。下面的稳定包名
只是应用程序的名称,如“HelloWorld”或任何您喜欢的名称:
REV_TAG=$(git log -1 --pretty=format:%h)
docker build -t <stable-package-name>:$REV_TAG .
REV_TAG=$(git log-1--pretty=格式:%h)
docker构建-t:$REV_标记。
稍后,我将标记的内容推送到远程存储库:
# nominate the tagged image for deployment
docker tag <stable-package-name>:$REV_TAG <repository-name>:$REV_TAG
# push docker image to remote repository
docker push <repository-name>
#指定要部署的标记映像
docker标签:$REV_标签:$REV_标签
#将docker映像推送到远程存储库
码头推手
Docker对标记值没有任何语义意义。标记可以是任何字符串值,并且可以重用标记。唯一的特殊标记值是,如果在docker pull
或docker run
命令中只说imagename
,它将自动解释为imagename:latest
机械地,您可以为同一图像提供多个标记,但需要docker推送所有标记。推送过程中昂贵的部分是图层内容,因此这将主要是在现有图像上推送替代标记的事实。类似地,如果图像标记是您已有图像的副本,则拖动图像标记几乎是免费的,但要找到给定图像的所有标记并不容易
我建议:
给每个构建一个唯一的标识符,比如源代码管理提交ID或时间戳
如果您发布了官方版本,还可以使用版本号标记该版本的版本。(更一般地说,如果当前源代码管理提交已标记,则使用源代码管理标记标记Docker映像。)
如果它对您的开发工作流有用,还可以使用分支名称标记分支提示的生成
考虑到它的突出性,将它标记为最新版本(可能是最新版本)可能是有用的
避免使用latest
和其他在引用内置图像时希望更改的标记(在docker run
命令中,Dockerfile来自
行,Kubernetes吊舱规格,…)
这种组合可能意味着同一图像被标记为imagename:g1234567
,:1.2.3
,:master
,和:latest
,您的CI系统将需要执行四次docker推送操作。你可能会认为前两幅图像相当稳定,但后两幅图像会经常变化。然后,您可以满怀信心地运行类似于imagename:1.2.3
的程序
(我想到的一个特例是一个很少更改的软件包,因此如果有上游修复或安全更新,可能需要重新构建。为此,重复使用相同的标记似乎是很典型的:例如,ubuntu:18.04
每一两周更新一次。)docker中的图像被引用,最常见的是图像存储库和标记。这个标签是一个相对自由的字符串,指向一个特定的图像。标签最好被认为是一个可变指针,它可以被更改,可以有多个指针指向同一个图像,并且可以在底层图像保持完整的情况下删除它
由于docker没有在标记上强制执行太多的结构(除了验证它是否包含有效字符并且不超过长度限制之外),因此强制执行这项操作是留给每个存储库维护人员的一项练习,并产生了许多不同的解决方案
对于存储库维护人员,以下是一些常见的实现:
选项A:理想情况下,存储库维护人员遵循某种形式的操作。此版本号应映射到打包软件的版本,通常带有图像修订的附加补丁号。重要的是,以这种方式标记的图像不仅应包括1.2.3-1版的标记,还应包括1.2.3、1.2和1版的标记,每个标记都将更新到各自层次结构中的最新版本。这允许下游用户依赖1.2并自动获得1.2.4的更新
$ docker inspect -f '{{json .RepoDigests}}' debian:latest
["debian@sha256:de3eac83cd481c04c5d6c7344cd7327625a1d8b2540e82a8231b5675cef0ae5f"]
$ docker run -it --rm debian@sha256:de3eac83cd481c04c5d6c7344cd7327625a1d8b2540e82a8231b5675cef0ae5f /bin/bash
root@ac9db398dc03:/#