docker堆栈部署是否与本地映像一起使用

时间:2017-04-19 07:12:26

标签: docker

我尝试使用docker stack deploy来部署本地节点应用。我有一个糟糕的时间来获得良好的工作流程。

我对堆栈部署和与docker hub的关系感到困惑。我很高兴必须在本地构建映像,但推送它是一个问题,因为我的网络速度很慢,图像是169MB。

我的问题是,如果我只是在本地构建映像,那么它应该由docker堆栈部署吗?或者我是否总是要将新图像发布到docker hub? n.b目前已发布到私人资料库。

我为什么要问? 我尝试使用本地docker build -t myname/myimage:latest,然后使用引用图像docker-compose.yml的{​​{1}}与docker stack deploy重新部署 - 但是另一个图像从24小时前重新出现,即使我使用{{{ 1}}(一次又一次)。然后,服务无法启动应该在新构建中解决的错误。

我只能认为堆栈部署部署的容器是基于在docker hub中发布的容器而不是本地映像。当然,myname/myimage:latest中出现的图像大小与当前位于泊坞窗中心的旧图像相匹配,而不是新图像。

也许我做错了什么或误解了堆栈的部署方式?

3 个答案:

答案 0 :(得分:1)

您应该尝试以这种方式构建本地图片:

  

docker build -t myimage。

并将其称为" myimage:latest"在您的撰写文件中,如果您想使用本地图像。

如果您想将其推送到集线器,请先将其标记

  

docker tag id_of_myimage my_dockerhub_username / myimage:latest

然后推它。

  

docker push my_dockerhub_username / myimage:latest

答案 1 :(得分:0)

在此工作流程中,我建议在另一个堆栈中本地运行docker-registry容器,然后将映像标记并推送到该“主机”,以便在构建其他堆栈时可以将其从那里拉出。

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 :(得分:0)

与此相关的是Docker中的一些错误

我最终writing a script做自己需要做的事情。该脚本用于本地单节点群集(这是我在开发中的内容)

#!/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);
}