【问题标题】:Export docker volume to another machine将 docker 卷导出到另一台机器
【发布时间】:2021-07-02 18:19:58
【问题描述】:

我目前正在尝试将 redmine 与 postgres 数据库一起使用,但在设置环境时遇到了一些问题。

假设我有以下撰写文件

  db-redmine:
    image: 'bitnami/postgresql:11'
    user: root
    container_name: 'orchestrator_redmine_pg'
    environment:
      - POSTGRESQL_USERNAME=${POSTGRES_USER}
      - POSTGRESQL_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRESQL_DATABASE=${POSTGRES_DB}
      - BITNAMI_DEBUG=true
    volumes:
      - 'postgresql_data:/bitnami/postgresql'

  redmine:
    image: 'bitnami/redmine:4'
    container_name: 'orchestrator_redmine'
    ports:
      - '3000:3000'
    environment:
      - REDMINE_DB_POSTGRES=orchestrator_redmine_pg
      - REDMINE_DB_USERNAME=${POSTGRES_USER}
      - REDMINE_DB_PASSWORD=${POSTGRES_PASSWORD}
      - REDMINE_DB_NAME=${POSTGRES_DB}
      - REDMINE_USERNAME=${REDMINE_USERNAME}
      - REDMINE_PASSWORD=${REDMINE_PASSWORD}
    volumes:
      - 'redmine_data:/bitnami'
    depends_on:
      - db-redmine

volumes:
  postgresql_data:
    driver: local
  redmine_data:
    driver: local

这会为 redmine 生成 postgres 数据库并创建 redmine 实例。

容器启动后,我进入 redmine 实例并配置应用程序,这意味着创建自定义字段、添加跟踪器、问题类型等。需要大量设置,所以我不想这样做每次我想部署这种容器。

我想,因为所有设置数据都将进入卷,所以我可以导出这些卷,然后在新机器上导入它们。这样,当两个应用程序在新机器上启动时,它们将拥有之前设置的所有必要信息。

这听起来很简单,但我在导出和导入阶段苦苦挣扎。

按照我所见,我可以通过执行以下操作将postgresql_data 导出到.tar 文件:

docker export postgresql_data --output="postgres_data.tar"

但是如何在新机器上导入新生成的.tar 文件呢?如果我没记错的话,通过将.tar 文件导入到新机器中名为postgresql_data 的卷中,模板中的数据将用于生成新容器。

有没有办法做到这一点?这是在两台主机之间复制设置的正确方法吗?

是否正在做类似docker volume create postgresql_data 然后将文件复制到卷目录的方法?

【问题讨论】:

    标签: docker docker-compose docker-volume


    【解决方案1】:

    我的建议是使用pg_dumppg_restore 工具,而不是应对音量。 您可以为 postgres 容器添加挂载路径,例如:

    db-redmine:
      image: 'bitnami/postgresql:11'
      user: root
      container_name: 'orchestrator_redmine_pg'
      environment:
        - POSTGRESQL_USERNAME=${POSTGRES_USER}
        - POSTGRESQL_PASSWORD=${POSTGRES_PASSWORD}
        - POSTGRESQL_DATABASE=${POSTGRES_DB}
        - BITNAMI_DEBUG=true
      volumes:
        - 'postgresql_data:/bitnami/postgresql'
        - /dump-files:/dump-files
    

    现在登录容器并运行pg_dump "Your-db-name" > /dump-files/dump 现在将此文件复制到任何新创建的容器并在新容器中运行:pg_restore -d "your-db-name" /dump-files/dump

    【讨论】:

    • 感谢您的回答!像command: pg_restore -d "dbname" /dump-files/dump 这样的东西会自动工作吗?尽管如此,即使需要手动完成,也可能会采用这种方法
    • 欢迎您!我认为没有一种不复杂、安全的方法可以自动完成。无论如何,在我看来,最好避免自动运行此类命令。
    【解决方案2】:

    首先,请注意docker export 与卷无关;该命令将 container 文件系统导出为 tar 存档。这不包括已安装卷中的任何内容。

    复制卷内容的最简单方法可能是这样的:

    docker run -v postgresql_data:/data alpine tar -C /data -cf- . |
      ssh remotehost docker run -i -v postgresql_data:/data alpine tar -C /data -xf-
    

    这会将现有卷中的所有内容进行 tar 处理,并通过 ssh 连接将其通过管道传输到远程主机,在那里我们创建一个新的 postgresql_data 容器并通过提取 tar 存档来填充它。

    特别是对于 postgres,您可以使用 pg_dumppg_restore 而不是使用 tar

    您将不得不修改您的容器名称,因为您使用docker-compose 创建它们。

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多