我尝试使用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
中出现的图像大小与当前位于泊坞窗中心的旧图像相匹配,而不是新图像。
也许我做错了什么或误解了堆栈的部署方式?
答案 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);
}