2017-02-28 25 views
2

我目前在管道中使用Docker群集模式,并且我大量使用docker stack deploy -c compose-file.yml name-of-the-stack作为使用最新码头映像更新堆栈的命令。它完美的工作,除非我不从yaml文件中删除服务。在这种情况下,stack deploy命令应该在更新另一个服务的图像时除去不再存在的服务,但行为是它使容器运行并且这不是预期的行为。 因为这个我改变它与docker stack rm name-of-the-service然后docker stack deploy -c compose-file.yml name-of-stack。但是这有另一个可怕的副作用,随机影响容器:docker stack rm name-of-the-stack命令往往使nginx容器proxypass的可靠性完全不可靠(似乎与此问题相关https://github.com/docker/docker/issues/24244)。 事实上,nginx容器(即在另一个堆栈中,但在同一覆盖网络中)负责处理容器之间的所有请求,并使用Docker群组模式的路由网格功能在它们之间建立代理通道,在部署堆栈的重新创建之后,无法代理请求,就好像它试图将流量转发到没有更多存在的容器一样,这会导致集成和行为测试失败。 有没有一种方法可以不使用docker stack rm(目前看起来很麻烦)而是应用yml撰写文件的最新状态?码头堆栈部署不会删除当前yaml撰写文件中未声明的服务

回答

3

您需要在您的docker stack deploy命令--prune选项:

$ docker stack deploy --help 

Usage: docker stack deploy [OPTIONS] STACK 

Deploy a new stack or update an existing stack 

Aliases: 
    deploy, up 

Options: 
     --bundle-file string Path to a Distributed Application Bundle file 
    -c, --compose-file string Path to a Compose file 
     --help     Print usage 
     --prune     Prune services that are no longer referenced 
     --with-registry-auth Send registry authentication details to Swarm agents