【问题标题】:How to generate a Postgresql Dump from a Docker container?如何从 Docker 容器生成 Postgresql 转储?
【发布时间】:2015-05-11 14:58:14
【问题描述】:

我想有办法进入 Postgresql 容器并从中获取数据转储。

【问题讨论】:

    标签: postgresql docker containers


    【解决方案1】:

    从 UNIX 或 Windows 终端使用以下命令:

    docker exec <container_name> pg_dump <schema_name> > backup
    

    以下命令将只转储所有表中的插入:

    docker exec <container_name> pg_dump --column-inserts --data-only  <schema_name> > inserts.sql
    

    【讨论】:

    • 你在哪里指定用户的用户名和密码?
    • @VaTo 你可以像这样指定用户:docker exec &lt;container_name&gt; pg_dump -U &lt;user&gt; --column-inserts --data-only &lt;schema_name&gt; &gt; inserts.sql
    • 如果您没有在容器中设置 PGUSER,您需要 export PGUSER=postgres 使其工作(postgres 9.6 中的 Testet)。
    • 这也适用于 windows cmd
    【解决方案2】:

    我有一个名为 postgres 的容器,其中安装了卷 -v /backups:/backups

    要备份 gzip 数据库 my_db 我使用:

    docker exec postgres pg_dump -U postgres -F t my_db | gzip >/backups/my_db-$(date +%Y-%m-%d).tar.gz
    

    现在我有

    user@my-server:/backups$ ls
    my_db-2016-11-30.tar.gz
    

    【讨论】:

    • 我收到了no such file or directory: /backups/my_db-2017-03-19.tar.gz,你知道为什么吗?
    • 我设法通过docker exec -t postgres bash -c 'pg_dump -U postgres -F t my_db | gzip &gt;/backups/my_db-$(date +%Y-%m-%d).tar.gz'解决了这个问题
    • 也许你没有 /backups 目录和/或它没有挂载?
    • 已安装。问题似乎来自 docker 不理解命令:stackoverflow.com/questions/37929190/…
    • 次要注意:这实际上并不是在执行tar gz,它只是在执行 gz,但您使用扩展名 tar 命名 SQL 文件,然后对其进行 gzip 压缩。如果您对其进行压缩,您会得到一个名为my_db-date.tar 的不可读文件,但如果您将 .tar 重命名为 .sql,它实际上是一个 SQL 文件。如果您确实想要.tar.gz 文件扩展名,您可能应该将其输出为“filename.gz”或使用tar -cz
    【解决方案3】:

    虽然上面的挂载点解决方案看起来很有希望,但以下是经过多次迭代后唯一对我有用的解决方案:

    docker run -it  -e PGPASSWORD=my_password postgres:alpine  pg_dump  -h hostname -U my_user my_db > backup.sql
    

    我的独特之处在于:我在数据库上有一个密码需要传入;需要传入标签(alpine);最后 psql 工具的 hosts 版本与 docker 版本不同。

    【讨论】:

    • 与上一个答案类似,它也适用于docker exec -e PGPASSWORD=mypass container pg_dump -U myuser mydb &gt; file.bkup.sql
    【解决方案4】:

    另一种解决方法是启动 postgre sql,并将挂载点指向 docker 中转储的位置。

    喜欢docker run -v &lt;location of the files&gt;。 然后对 docker running 容器执行 docker inspect

    docker inspect <image_id>
    

    你可以在里面找到“Volumes”标签和一个相应的位置。转到该位置,你可以找到所有的 postgresql/mysql 文件。它对我有用。让我们知道这是否也对你有用。

    祝你好运

    【讨论】:

      【解决方案5】:

      这个使用 container_name 而不是 database_scheme 的,对我有用:

      docker exec {container_name} pg_dump -U {user_name} > {backup_file_name}
      

      例如,对我来说,数据库名称、用户和密码应该在 docker-compose.yaml 中声明

      我希望它可以帮助某人

      【讨论】:

        【解决方案6】:

        对于那些有权限的人,我使用以下命令成功执行了我的转储:

        docker exec -i MY_CONTAINER_NAME /bin/bash -c "PGPASSWORD=MY_PASSWORD pg_dump -Fc -h localhost -U postgres MY_DB_NAME" > /home/MY_USER/db-$(date +%d-%m-%y).backup
        

        【讨论】:

          【解决方案7】:

          这将挂载密码并包含您的环境变量

          docker run -it --rm \
          --env-file <(env) \
          -w /working \
          --volume $(pwd):/working \
          postgres:latest /usr/bin/pg_dump -Fc -h localhost -U postgres MY_DB_NAME" > /working/db-$(date +%d-%m-%y).backup
          

          【讨论】:

            【解决方案8】:

            要运行具有 Postgres 用户和密码的容器,您需要预先配置变量作为容器环境变量。 例如:

            docker run -it --rm --link &lt;container_name&gt;:&lt;data_container_name&gt; -e POSTGRES_PASSWORD=&lt;password&gt; postgres /usr/bin/pg_dump -h &lt;data_container_name&gt; -d &lt;database_name&gt; -U &lt;postgres_username&gt; &gt; dump.sql

            【讨论】:

            • --link 是一项旧功能。
            猜你喜欢
            • 2022-01-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-16
            • 2019-04-08
            • 2022-01-04
            • 2016-10-16
            • 2017-10-15
            相关资源
            最近更新 更多