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

Docker mount non-empty container folder to host

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

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

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

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

volumes:
  - odoo_web_data:/var/lib/odoo

和运行

docker-compose up -d

重新创建容器。

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

WARNING: Service "odoo" is using volume "/var/lib/odoo" from the previous container. Host mapping "user_odoo_customer_web_data" has no effect. Remove the existing containers (with docker-compose rm odoo-customer) to use the host volume mapping.

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

如何从主机上的 运行ning 容器持久挂载文件夹?

您可以尝试先将 /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 数据,并且容器将从该卷中使用(并存储)它。