在没有swarm模式的情况下,我首先停止旧版本的应用程序,使用新版本的应用程序运行一次性迁移命令,然后最终启动新版本的应用程序来运行迁移:
# Setup is roughly the following $docker network create appnet $docker run -d --name db --net appnet db:1 $docker run -d --name app --net appnet -p 80:80 app:1 # Update process $docker stop app && docker rm app $docker run --rm --net appnet app:2 npm run migrate $docker run -d --name app --net appnet -p 80:80 app:2
现在我正在测试docker swarm模式中的设置,以便我可以轻松扩展应用程序.问题是在群集模式下,无法在群集网络中启动容器,因此我无法访问数据库来运行迁移:
$docker network ls NETWORK ID NAME DRIVER SCOPE 6jtmtihmrcjl appnet overlay swarm # Trying to replicate the manual migration process in swarm mode $docker service scale app=0 $docker run --rm --net appnet app:2 npm run migrate docker: Error response from daemon: swarm-scoped network (appnet) is not compatible with `docker create` or `docker run`. This network can only be used by a docker service.
我也不想在app启动期间运行迁移命令,因为可能会有几个实例启动,这可能会使数据库失灵.自动迁移是可怕的,所以我想不惜一切代价避免它们.
您是否知道如何在docker swarm模式下实现手动迁移步骤?
编辑
我发现了一个允许复制原始工作流程的脏黑客.想法是使用自定义命令创建新服务,并在其任务之一完成时将其删除.这远非令人愉快的使用,更好的替代品非常受欢迎!
$docker service scale app=0 $docker service create --name app-migrator --network appnet app:2 npm run migrate # Check when the first app-migrator task is finished and check its output $docker service ps app-migrator $docker logs <container id from app-migrator> $docker service rm app-migrator # Ready to update the app $docker service update --image app:2 --replicas 2 app我相信你可以通过使你的覆盖网络,appnet,可连接来解决这个问题.这可以使用以下命令完成:
docker network create --driver overlay --attachable appnet
这应该可以修复swarm-scoped网络错误,并允许您运行迁移
精彩评论