升级镜像时 Docker-compose 卷重置

Posted

技术标签:

【中文标题】升级镜像时 Docker-compose 卷重置【英文标题】:Docker-compose volume resetting when upgrading image 【发布时间】:2021-09-26 03:48:54 【问题描述】:

我有一个 Grafana 8.0.5 的 docker 镜像。我使用docker volume create grafana-storage创建了一个卷

我可以停止音量,然后将其恢复而不会丢失数据。

但是,如果我将 docker-compose.yml 更新为指向最新版本 8.0.6,然后重新运行 docker-compose up -d,卷将恢复为默认安装,从而丢失我之前创建的任何仪表板、帐户、数据源等。

据我所知,我不应该丢失任何数据,因为它应该都在卷中。如何在不重置音量的情况下更新图像

docker-compose.yml:

version: "3.3"

volumes:
  grafana-storage:
    external: true

services:

  grafana:
    image: "grafana/grafana:8.0.6"
    container_name: "grafana"
    volumes:
      - "grafana-storage:/usr/src/grafana"

Docker 版本:

Docker version 20.10.7, build f0df350

Docker-Compose 版本:

docker-compose version 1.29.2, build 5becea4c

码头工人ps:

CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                                           NAMES
3fb6da4a8de9   grafana/grafana:8.0.6   "/run.sh"                17 minutes ago   Up 17 minutes   3000/tcp                                        grafana
046892ab0a7b   traefik:v2.0            "/entrypoint.sh --pr…"   46 minutes ago   Up 23 minutes   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   traefik

docker 卷 ls:

DRIVER    VOLUME NAME
local     grafana-storage

【问题讨论】:

不知道解决方案,但有两件事可以尝试:1) 'docker volumer inspect' 是什么样的? 2) 尝试使用 './grafanastorage' 代替 'grafana-storage' (不要破折号,将卷放在您自己的文件夹中,而不是 Docker 文件夹中)。 【参考方案1】:

数据不是存储在/usr/src/grafana,而是/var/lib/grafana。因此,docker-compose.yml 中的卷定义错误,每次重新创建容器时,数据都会丢失。

将路径更改为/var/lib/grafana,它应该可以工作:

services:
  grafana:
    [...]
    volumes:
      - "grafana-storage:/var/lib/grafana"

【讨论】:

更改路径是正确的。那么,卷路径是否依赖于图像?我认为这类似于我将 grafana 或任何其他图像下载/解压缩到我选择的目录中 是的,每个图像都定义了自己的路径,这些路径大多记录在某处。例如,Grafana 有文档here。

以上是关于升级镜像时 Docker-compose 卷重置的主要内容,如果未能解决你的问题,请参考以下文章

openstack常用命令-cinder篇

使用 docker-compose 时如何在容器内使用主机用户修改卷文件

实战利用LVM卷镜像技术实现不停业务的数据在线迁移,核心存储升级混闪V7000F 转

docker-compose

docker-compose Portainer

为啥我的 docker-compose 卷没有使用本地文件添加进行更新?