有没有一种方法可以从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] 删除。
我来说两句