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

nin*_*dev 6 docker docker-registry docker-compose 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:
Run Code Online (Sandbox Code Playgroud)

我的代码位于app带有来自我的注册表的图像的容器中。

我想更新我的代码,docker service update --image <MYREGISTRY>/app:latest但它不起作用代码没有改变。我猜它使用本地卷app-data代替。

新容器数据不覆盖卷数据是否正常?

BMi*_*tch 4

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

如果您需要使用每个新图像更新文件,那么它们也许不应该位于一个卷中?如果您确实需要在卷内使用这些内容,那么您可能需要创建一个过程来更新映像中的卷,例如,如果这是一个docker run,您可以执行以下操作:

docker run -v app-data:/target --rm <your_registry>/app cp -a /var/www/app/. /target/.
Run Code Online (Sandbox Code Playgroud)

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