首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker堆栈部署是否与本地映像一起工作?

docker堆栈部署是否与本地映像一起工作?
EN

Stack Overflow用户
提问于 2017-04-19 07:12:26
回答 3查看 6.8K关注 0票数 12

我试图使用docker堆栈部署来部署本地节点应用程序。我很难得到一个好的工作流程。

我对堆栈部署和与码头枢纽的关系感到困惑。我很高兴不得不在本地构建映像,但是推动它是一个问题,因为我的网络太慢了,映像是169 my。

我的问题是,如果我只是在本地构建映像,那么它是否应该由docker堆栈部署来部署?还是我总是要把新的图像发布到码头枢纽?注:目前它已发布到一个私有存储库中。

为什么要问这个问题?,我试着做一个本地docker build -t myname/myimage:latest,然后用引用图像myname/myimage:latestdocker-compose.yml重新部署它,但是另一个映像从24小时前就一直出现,即使我使用docker rmi在本地删除了它(一次又一次)。然后,服务无法从应该在新构建中解决的错误开始。

我只能认为堆栈部署所部署的容器是基于在docker集线器中发布的容器,而不是本地映像。当然,在docker images中不断出现的图像的大小与当前停靠中心中的旧图像相匹配,而不是新的图像。

也许我做错了什么或者误解了堆栈部署是如何工作的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-19 08:29:42

你应该试着用这样的方式来建立你的本地形象:

码头建立-t我的形象。

如果您想使用本地映像,请将其称为撰写文件中的“myimage:最新”。

如果您想将它推送到集线器,那么首先标记它。

docker标记id_of_myimage my_dockerhub_username/myimage:最新

然后再推它。

docker推送my_dockerhub_username/myimage:最新

票数 5
EN

Stack Overflow用户

发布于 2018-07-20 06:32:18

在这个工作流中,我建议在另一个堆栈中本地运行docker注册表容器,然后标记图像并将图像推送到“主机”,这样在构建其他堆栈时就可以从那里提取图像。

代码语言:javascript
复制
docker build -t my.docker.registry:5000/myimage:latest -t my.docker.registry:5000/myimage:specificversion .

然后是docker push my.docker.registry:5000/myimage,它将把它放在本地注册表上。

在此之后,您应该能够从堆栈中提取出一个新版本,并在更改容器的内容时将其标记为最新版本。

用另一个示例https://forums.docker.com/t/docker-swarm-mode-and-local-images/22894/3概述

票数 2
EN

Stack Overflow用户

发布于 2020-11-06 09:59:29

关于这一点,Docker中有几个bug

我最终得到了写剧本来为自己做我需要做的事情。此脚本用于本地单节点群(这是我正在开发的)。

代码语言:javascript
复制
#!/usr/bin/perl
use strict;
my $stack_name = shift;
open(TASKS, qq#docker stack ps --format "{{.ID}} {{.Image}}" --no-trunc $stack_name|#) || die $!;
my %tasks;
while (<TASKS>) {
    my ($id, $image) = m/^([^\s]+?)\s(.*)$/;
    $tasks{$id} = $image;
}
close(TASKS);

my %needs_update; 
for my $task_id (keys %tasks) {
    open(CONTAINER, qq#docker ps --filter "name=.*$task_id" --no-trunc --format '{{.Image}} {{.ID}}'|#) || die $!;
    $_ = <CONTAINER>;
    my ($image, $container_id) = m/^([^\s]+?)\s(.*)$/;
    close(CONTAINER);

    if ($image && $image ne $tasks{$task_id}) {
        open(CONTAINERINSPECT, q#docker inspect --format '{{ index .Config.Labels "com.docker.swarm.service.name" }}' # . $container_id . "|") || die $!;
        $_ = <CONTAINERINSPECT>;
        chomp;
        $needs_update{$_} = $tasks{$task_id};
        close(CONTAINERINSPECT);
    }
    
}
for(keys %needs_update){
    open(UPDATE, "docker service update -d --no-resolve-image --force --image $needs_update{$_} $_ |") || die $!;
    print <UPDATE>;
    close(UPDATE);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43488905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档