docker-compose配置如何在使用现有卷的同时从使用匿名卷过渡到命名卷?

海伦·马丁(Helene Martin)

有没有一种方法可以从docker-compose使用所有匿名卷配置迁移到使用命名卷的配置,而无需手动干预来维护数据(例如,手动复制文件夹)?这可能需要让用户在主机上运行脚本,但是如果没有运行脚本,则需要采取一些防范措施来防止后续的docker-compose up成功。

我为用户安装在一系列基础架构上的开源服务器应用程序做出了贡献。我们的用户通常不是很熟练,并且资源有限。我们提供了一个docker-compose基于简单的设置。持久数据位于容器化的postgres数据库中,该数据库将其数据存储在匿名卷上。我们所有的管理说明都涉及停止运行容器,但不降低容器的运行速度。

这对于大多数用户来说效果很好,但是有些用户最终还是这样做docker-compose down,因为他们有一点Docker经验,或者通过简单的类比up当他们备份服务器时,会获得新的匿名卷,并且看起来好像丢失了数据。我们提供了有关从此状态中恢复的说明,但是这种情况经常发生,因此我们需要重新考虑我们的配置并探索向命名卷的过渡。

我们有许多用户愉快地使用匿名卷并严格按照我们的管理说明进行操作。这些是我们技术最少的用户,我们希望确保它们不会受到我们对docker-compose配置所做的任何更改的负面影响因此,我们不能“仅”更改docker-compose配置以使用命名卷并提供脚本来迁移数据。用户可能会忘记/无法运行该脚本,并最终以为自己丢失了所有数据,这有很大的风险。如果我们可以以某种方式确保仅在数据迁移完成后才成功使用新配置备份服务,则这种方法会很好。

对于那些想知道我们是否选择使用容器化数据库的人的补充说明:我们还有一条供用户指定外部数据库服务器(例如RDS)的路径,但这只能由资源最丰富的用户访问。

编辑:是一个类似的ServerFault问题。

海葵

假设您使用的是官方PostgreSQL映像,则可以利用其数据库初始化系统

如果要在从该镜像派生的映像中进行其他初始化,请在/docker-entrypoint-initdb.d下添加一个或多个* .sql,*。sql.gz或* .sh脚本(必要时创建目录) )。入口点调用initdb创建默认的postgres用户和数据库后,它将运行任何* .sql文件,任何可执行的* .sh脚本并提供该目录中所有不可执行的* .sh脚本,以进行进一步的初始化。启动服务。

随着变化 PGDATA

此可选变量可用于为数据库文件定义另一个位置,例如子目录。默认值为/ var / lib / postgresql / data。如果您使用的数据量是文件系统挂载点(例如GCE永久磁盘)或无法被postgres用户使用的远程文件夹(例如某些NFS挂载),则Postgres initdb建议创建一个子目录来包含数据。

解决问题。这个想法是您为Postgres文件定义一个不同的位置,然后在其中安装一个命名卷。新位置最初将为空,并且将触发数据库初始化脚本。您可以使用它从匿名卷中移出数据,并只执行一次。

我准备了一个示例供您测试。首先,在其中包含一些示例数据的匿名卷上创建一个数据库:

docker-compose.yml

version: "3.7"
services:
  postgres:
    image: postgres
    environment:
      POSTGRES_PASSWORD: test
    volumes:
      - ./test.sh:/docker-entrypoint-initdb.d/test.sh

test.sh

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "postgres" --dbname "postgres" <<-EOSQL
    CREATE TABLE public.test_table (test_column integer NOT NULL);
    INSERT INTO public.test_table VALUES (1);
    INSERT INTO public.test_table VALUES (2);
    INSERT INTO public.test_table VALUES (3);
    INSERT INTO public.test_table VALUES (4);
    INSERT INTO public.test_table VALUES (5);
EOSQL

注意它test.sh如何安装的,它应该在/docker-entrypoint-initdb.d/目录中以便在初始化阶段执行。上下移动堆栈以使用此样本数据初始化数据库。

现在创建一个脚本来移动数据:

move.sh

#!/bin/bash
set -e

rm -rf $PGDATA/*
mv /var/lib/postgresql/data/* "$PGDATA/"

docker-compose.yml使用命名卷和数据的自定义位置更新

docker-compose.yml

version: "3.7"
services:
  postgres:
    image: postgres
    environment:
      POSTGRES_PASSWORD: test
      # set a different location for data
      PGDATA: /pgdata
    volumes:
      # mount the named volume
      - pgdata:/pgdata
      - ./move.sh:/docker-entrypoint-initdb.d/move.sh

volumes:
  # define a named volume
  pgdata: {}

当您将此堆栈调出时,它将找不到数据库(因为命名的卷最初为空),并且Postgres将运行初始化脚本。首先,它运行自己的脚本来创建一个空数据库,然后从/docker-entrypoint-initdb.d目录中运行自定义脚本在此示例中,我安装move.sh到该目录中,该目录将删除临时数据库并将旧数据库移至新位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用docker-compose创建命名的docker卷?

来自分类Dev

通过Docker Compose重用现有卷

来自分类Dev

通过Docker Compose重用现有卷

来自分类Dev

在docker-compose ELK堆栈上重新使用现有卷

来自分类Dev

如何使用docker compose在容器中使用已创建的卷?

来自分类Dev

如何使用Docker Compose v2使卷永久化

来自分类Dev

如何使用docker-compose创建反向绑定卷?

来自分类Dev

如何使用ECS和docker-compose填充具有本地内容的卷

来自分类Dev

有没有一种方法可以使用docker compose标记或命名卷实例?

来自分类Dev

何时可以使用docker compose提供docker卷?

来自分类Dev

Docker-compose命名挂载卷

来自分类Dev

如何在Docker中使用卷同步更改

来自分类Dev

如何在docker中使用文件系统创建卷?

来自分类Dev

如何使用docker volume命令创建的卷?

来自分类Dev

当我同时使用主机卷(绑定安装)和命名卷(一种 docker 管理的卷)时会发生什么?

来自分类常见问题

如何在Docker 1.9+中列出命名卷的内容?

来自分类Dev

卷上的Docker Compose使用环境变量

来自分类Dev

使用 docker-compose 在卷上保存 mongodb

来自分类Dev

使用持久卷启动 postgres 容器 [docker compose]

来自分类Dev

在我的 docker-compose 中不使用卷有什么影响?

来自分类Dev

在Docker中使用现有文件共享/卷-与Docker for Windows WSL2一起编写

来自分类Dev

Docker / Docker-Compose中的NFS卷

来自分类Dev

Docker命名卷未更新

来自分类Dev

Docker命名卷未更新

来自分类Dev

卷和docker-compose

来自分类Dev

如何在Docker Compose中声明Docker卷存在于外部hardrive中

来自分类Dev

如何在docker-compose中将卷连接到docker容器

来自分类Dev

使用Windows主机时如何挂载Docker卷?

来自分类Dev

Docker使用卷共享环境变量

Related 相关文章

  1. 1

    使用docker-compose创建命名的docker卷?

  2. 2

    通过Docker Compose重用现有卷

  3. 3

    通过Docker Compose重用现有卷

  4. 4

    在docker-compose ELK堆栈上重新使用现有卷

  5. 5

    如何使用docker compose在容器中使用已创建的卷?

  6. 6

    如何使用Docker Compose v2使卷永久化

  7. 7

    如何使用docker-compose创建反向绑定卷?

  8. 8

    如何使用ECS和docker-compose填充具有本地内容的卷

  9. 9

    有没有一种方法可以使用docker compose标记或命名卷实例?

  10. 10

    何时可以使用docker compose提供docker卷?

  11. 11

    Docker-compose命名挂载卷

  12. 12

    如何在Docker中使用卷同步更改

  13. 13

    如何在docker中使用文件系统创建卷?

  14. 14

    如何使用docker volume命令创建的卷?

  15. 15

    当我同时使用主机卷(绑定安装)和命名卷(一种 docker 管理的卷)时会发生什么?

  16. 16

    如何在Docker 1.9+中列出命名卷的内容?

  17. 17

    卷上的Docker Compose使用环境变量

  18. 18

    使用 docker-compose 在卷上保存 mongodb

  19. 19

    使用持久卷启动 postgres 容器 [docker compose]

  20. 20

    在我的 docker-compose 中不使用卷有什么影响?

  21. 21

    在Docker中使用现有文件共享/卷-与Docker for Windows WSL2一起编写

  22. 22

    Docker / Docker-Compose中的NFS卷

  23. 23

    Docker命名卷未更新

  24. 24

    Docker命名卷未更新

  25. 25

    卷和docker-compose

  26. 26

    如何在Docker Compose中声明Docker卷存在于外部hardrive中

  27. 27

    如何在docker-compose中将卷连接到docker容器

  28. 28

    使用Windows主机时如何挂载Docker卷?

  29. 29

    Docker使用卷共享环境变量

热门标签

归档