当前位置: 首页 > 知识库问答 >
问题:

如果更新了基本映像,如何自动更新docker容器

王俊哲
2023-03-14

假设我有一个基于< code>ubuntu:latest的小容器。现在有一个安全更新,docker repo中更新了< code>ubuntu:latest。

>

  • 我怎么知道我的本地映像及其容器在后面运行?

    是否有一些最佳实践可以自动更新本地映像和容器以遵循 docker 存储库更新,这在实践中将为您提供在传统 ubuntu 计算机上运行无人值守升级的相同细节

  • 共有3个答案

    颛孙信厚
    2023-03-14

    “泊坞窗方式”是使用泊坞站中心自动化构建。存储库链接功能将在重建上游容器时重新生成容器,Webhooks 功能将向您发送通知。

    看起来网络钩子仅限于 HTTP 开机自检调用。您需要设置一个服务来捕获它们,或者可能使用其中一个POST来发送电子邮件服务。

    我还没有研究过,但是新的Docker通用控制平面可能有一个检测更新的容器和重新部署的特性。

    华子昂
    2023-03-14

    可以使用 Watchtower 监视从中实例化容器的映像的更新,并使用更新的映像自动拉取更新并重新启动容器。但是,这并不能解决在基于自定义映像的上游映像发生更改时重新生成自己的自定义映像的问题。您可以将此视为由两部分组成的问题:(1) 知道上游映像何时更新,以及 (2) 执行实际的映像重建。(1)可以很容易地解决,但是(2)很大程度上取决于你当地的构建环境/实践,所以为此创建一个通用的解决方案可能要困难得多。

    如果您能够使用Docker Hub的自动构建,那么使用存储库链接功能可以相对干净地解决整个问题,该功能允许您在链接的存储库(可能是上游存储库)更新时自动触发重建。您还可以配置网络钩子,以便在自动构建发生时通知您。如果您想要电子邮件或短信通知,您可以将网络钩子连接到IFTTT Maker。我发现IFTTT用户交互界面有点混乱,但您可以将Docker网络钩子配置为发布到https://maker.ifttt.com/trigger/“docker_xyz_image_built”/with/key/“your_key”。

    如果需要在本地构建,至少可以通过在Docker Hub中创建链接到您感兴趣的回购的虚拟回购来解决在更新上游映像时获取通知的问题。虚拟回购的唯一目的是在重建时触发webhook(这意味着其链接回购之一已更新)。如果你能收到这个webhook,你甚至可以用它来触发你这边的重建。

    司空炯
    2023-03-14

    我们使用一个脚本来检查运行中的容器是否使用最新的映像启动。我们还使用upstart init脚本来启动docker映像。

        #!/usr/bin/env bash
        set -e
        BASE_IMAGE="registry"
        REGISTRY="registry.hub.docker.com"
        IMAGE="$REGISTRY/$BASE_IMAGE"
        CID=$(docker ps | grep $IMAGE | awk '{print $1}')
        docker pull $IMAGE
    
        for im in $CID
        do
            LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
            RUNNING=`docker inspect --format "{{.Image}}" $im`
            NAME=`docker inspect --format '{{.Name}}' $im | sed "s/\///g"`
            echo "Latest:" $LATEST
            echo "Running:" $RUNNING
            if [ "$RUNNING" != "$LATEST" ];then
                echo "upgrading $NAME"
                stop docker-$NAME
                docker rm -f $NAME
                start docker-$NAME
            else
                echo "$NAME up to date"
            fi
        done
    

    而且它看起来像

    docker run -t -i --name $NAME $im /bin/bash
    
     类似资料:
    • 问题内容: 假设我有一个基于的琐碎容器。现在有一个安全更新,并在docker repo中进行了更新。 我怎么知道我的本地映像及其容器在后面运行? 是否有一些最佳实践来自动更新本地映像和容器以跟随docker repo更新,实际上,这会给您带来与在常规ubuntu机器上运行无人值守升级一样的好处。 问题答案: 一种方法是通过CI / CD系统来驱动它。构建父映像后,请使用该父映像扫描git repo

    • 问题内容: 我正在通过创建带有一些nodejs指令的来玩docker。现在,每次更改dockerfile时,我都会通过在项目文件夹中运行来重新创建映像,但这每次都会创建一个新映像,并很快吞没我的ssd。 更改dockerfile时,是否有一种方法可以更新现有映像,或者每次更改文件时都被迫创建一个新映像? 抱歉,这是一个愚蠢的问题 问题答案: 只要没有指令,Docker构建支持缓存。如果您正在积极地

    • 问题内容: 我有一个打包在公共存储库中的docker映像中的node.js应用程序。 我已将该映像成功部署在AWS Beanstalk泊坞应用中。问题是,我期望在更新公共存储库中的映像时自动更新Beanstalk应用程序,因为以下配置建议。 Dockerrun.aws.json: Dockerfile非常简单: 亚马逊文档对此非常清楚: (可选)包括更新密钥。默认值为“ true”,它指示Elas

    • 我目前正在运行官方的ghost Docker映像,并使用该映像构建几个容器。 如果我想更新my Docker映像,我只需使用以下命令:

    • 问题内容: 我有一个泊坞窗映像,我想找出它是从哪个映像创建的。当然有多层,但是我想找出最后一张图像(dockerfile中该图像的FROM语句)? 我尝试使用,但无法在其中找到此信息。 我尝试使用以下命令,但它给我一条错误消息 这是我收到的错误消息 问题答案: 您可以使用此答案中建议的方法:https : //stackoverflow.com/a/53841690/3691891 首先,拉: 获

    • 在我看来,容器是Image的运行实例。如果容器崩溃了,例如运行delete all the stuffs,docker映像还可以吗?