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

我运行一个生产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: 

我的代码是在我的registry中的app容器与图像。

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

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

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

如果您需要更新每个新图像的文件,那么也许他们不应该在一个卷? 如果您确实需要这些内容,那么您可能需要创build一个过程来更新映像中的卷,例如,如果这是一个docker run ,您可以:

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

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