Docker 将非空容器文件夹挂载到主机

时间:2021-01-13 17:02:52

标签: docker docker-compose docker-volume

我正在运行一些由 docker-compose 文件定义的容器,并且这些容器已在生产中使用。

我发现其中一个容器 (odoo) 正在使用一个数据目录,它在其中放置了一些重要且应保存的与进程相关的文件。

不幸的是,我忘记为数据使用卷来使其持久化,现在想这样做。

我尝试编辑 docker-compose.yml 文件并在 odoo 服务中定义一个卷,例如:

volumes:
  - odoo_web_data:/var/lib/odoo

然后运行

docker-compose up -d

重新创建容器。

如果容器是最初创建的,这将起作用,但是,我现在得到的只是一个警告:

<块引用>

警告:服务“odoo”正在使用来自前一个容器的卷“/var/lib/odoo”。主机映射“user_odoo_customer_web_data”无效。移除现有容器(使用 docker-compose rm odoo-customer)以使用主机卷映射。

我猜这意味着它无法挂载,因为文件夹非空并且链接到容器的前一个实例。

如何从主机上正在运行的容器中持久地挂载文件夹?

1 个答案:

答案 0 :(得分:1)

您可以尝试先将 /var/lib/odoo 中的所有文件备份到您的主机上:

docker run --rm -v c:\migrate:/backup alpine tar -cjf /backup/my_data.tar.bz2 -C /var/lib/odoo ./

然后将该 tar.bz2 导入您创建的 odoo_web_data 卷:

docker run --rm -v odoo_web_data:/volume -v c:\migrate:/backup alpine tar -C /volume/ -xjf /backup/my_data.tar.bz2

将此添加到您的 docker-compose.yml 底部:

volumes:
  odoo_web_data:
    external: true

然后继续使用 docker-compose up -d 和代码中已有的卷安装再次启动容器。

此时您应该在新命名的卷中拥有所有先前的 /var/lib/odoo 数据,并且容器将从该卷中使用(并存储)它。