Docker堆栈部署滚动更新卷问题

时间:2017-03-15 00:08:04

标签: docker docker-compose docker-registry docker-swarm

我正在为生产PHP-FPM / Nginx应用程序运行docker,我想使用docker-stack.yml并部署到swarm集群。这是我的档案:

version: "3"
services:

app:
  image: <MYREGISTRY>/app
volumes:
   - app-data:/var/www/app
deploy:
  mode: global

php:
  image: <MYREGISTRY>/php
volumes:
   - app-data:/var/www/app
deploy:
  replicas: 2

nginx:
  image: <MYREGISTRY>/nginx
    depends_on:
      - php
  volumes:
    - app-data:/var/www/app
  deploy:
    replicas: 2
  ports:
    - "80:80"

volumes:
 app-data:

我的代码位于app容器中,其中包含我的注册表中的图像。

我想用docker service update --image <MYREGISTRY>/app:latest更新我的代码,但它不能正常工作代码不会更改。 我想它会改为使用本地卷app-data

新容器数据是否覆盖了卷数据,这是正常的吗?

2 个答案:

答案 0 :(得分:1)

我有同样的问题,我有app和nginx容器共享相同的卷。我当前的解决方案有一个运行

的部署脚本
docker service update --mount-add mount service

用于Docker堆栈部署后的app和nginx。它将强制更新app和nginx容器的卷。

答案 1 :(得分:0)

是的,这是预期的行为。命名卷仅在它们为空时(初始创建时的默认状态)初始化为图像内容。在该点之后的任何时间更新卷都可能会因覆盖或删除明确要求保留的卷数据而导致数据丢失。

如果您需要使用每个新图像更新文件,那么它们可能不应该在卷中?如果确实在卷内需要这些,则可能需要创建一个过程来更新图像中的卷,例如:如果这是docker run,你可以这样做:

docker run -v app-data:/target --rm <your_registry>/app cp -a /var/www/app/. /target/.

否则,您可以删除卷,或者只是从卷中删除所有文件,然后重新启动堆栈以再次填充它。