【问题标题】:Need to completely export a Docker image from a system to another system, how to find volumes to export data?需要将一个系统的 Docker 镜像完全导出到另一个系统,如何找到卷导出数据?
【发布时间】:2022-01-11 21:28:51
【问题描述】:

我正在尝试将整个 Docker 容器导出到必须在第二个系统上运行的映像中。还必须导出数据(卷)。我关注了this tutorial,但在尝试检索和导出我的卷时发现了一些困难。

我检查了要导出的 Docker 容器,以便检索卷信息:

sudo docker inspect postgresql

我在输出中搜索了 Mounts 部分以找到我的卷应该在哪里,我得到了这个:

"Mounts": [
    {
        "Type": "volume",
        "Name": "spring-microservies-course_psdb-volume",
        "Source": "/var/lib/docker/volumes/spring-microservies-course_psdb-volume/_data",
        "Destination": "/var/lib/postgresql/data",
        "Driver": "local",
        "Mode": "rw",
        "RW": true,
        "Propagation": ""
    }
],

所以我想我的卷应该在/var/lib/docker/volumes/spring-microservies-course_psdb-volume/_data 目录中。

问题是这就是我在这个文件夹中的内容:

andrea@ubuntu:/var/lib$ sudo ls -a /var/lib/docker/volumes/spring-microservies-course_psdb-volume/_data
.   base    pg_commit_ts  pg_hba.conf    pg_logical    pg_notify    pg_serial     pg_stat      pg_subtrans  pg_twophase  pg_wal   postgresql.auto.conf  postmaster.opts
..  global  pg_dynshmem   pg_ident.conf  pg_multixact  pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    PG_VERSION   pg_xact  postgresql.conf

那么,为了获得我的数据,我必须与容器映像一起导出的卷在哪里?

【问题讨论】:

  • 数据。该卷正在将您的本地目录安装到容器中。
  • @jonrsharpe 所以我必须导出所有这个目录“/var/lib/docker/volumes/spring-microservies-course_psdb-volume/_data”,以便在我将图像迁移到另一个机器?
  • 通过我在上一个问题中链接的相同文档:docs.docker.com/storage/volumes/…

标签: docker docker-volume docker-image


【解决方案1】:

我首先想到的是从我正在运行的容器中创建一个新的 docker 映像并从该容器中复制我需要的内容,尝试按照以下步骤操作:

根据您正在使用的容器创建一个 docker 映像:

docker commit <image_name> <new_image_name>

复制你想从正在运行的容器中获取的内容(确保你以管理员/root身份运行这个命令:

docker cp <image_name>:<directory_path_inside_container> <directory_path_on_your_machine>

确保您已登录:

docker login

将新创建的镜像推送到您的 docker 存储库(不要忘记创建一个):

docker push <new_image_name>

完成推送后,转到其他系统并拉取图像

docker pull <new_image_name>

如果你在你的 docker 镜像名称中指定镜像标签和版本会更好。

现在您已经获得了映像和所需的数据,只需将数据复制到新系统,使用绑定挂载您的数据运行新映像。

【讨论】:

  • docker commit 几乎从来都不是最佳实践,我不会推荐它。它也不能满足这个提问者的需求,因为提交一个容器不包括卷或绑定挂载中的任何数据;提交数据库容器不包括其数据。你应该把你的容器想象成一个进程,你可以用^C停止并再次运行;容器退出时本地存储中的任何内容都会丢失,但您可以从 Dockerfile 重建新的二进制文件。
  • 我在命令中包含了docker cpdocker commit,这将允许他复制所需的内容和容器的配置,正如我所说,他可以复制保存在他的机器上的数据使用docker cp 命令,在运行容器时使用Dockerfile 使用COPYbind mount volume
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多