正确控制Docker映像的版本

正确控制Docker映像的版本,docker,versioning,Docker,Versioning,接下来是4年前的问题 ,因为IMHO未正确解决Docker映像的版本控制问题: 我觉得这个答案并不充分,因为同一个标签可能有连续的版本。我们需要一种能够将依赖项锁定到特定版本的标记上的方法 而且 答案是不要使用latest 我在网上找到的“解决方案”也令人困惑。例如: 它暗示不使用最新版本,“解决方案”暗示要标记两次。我强调“暗示”,因为(对我)没有可靠的推荐 它甚至显示我们需要在同一张图像上执行两次docker push 那么,如何正确地控制Docker映像的版本(本地和推/发布到Dock

接下来是4年前的问题 ,因为IMHO未正确解决Docker映像的版本控制问题:

我觉得这个答案并不充分,因为同一个标签可能有连续的版本。我们需要一种能够将依赖项锁定到特定版本的标记上的方法

而且

答案是不要使用
latest

我在网上找到的“解决方案”也令人困惑。例如:

  • 它暗示不使用
    最新版本
    ,“解决方案”暗示要标记两次。我强调“暗示”,因为(对我)没有可靠的推荐
  • 它甚至显示我们需要在同一张图像上执行两次docker push
那么,如何正确地控制Docker映像的版本(本地和推/发布到Docker hub时)

修改:

到目前为止,有两个答案。谢谢你

  • 两者都使用git的短版本ID
  • 两人都错过了答案中的推送/发布部分
正如我所做的那样,我需要将我的docker图像推送/发布到docker存储库,并且从中可以看出,如果您使用特定的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:/#