Postgresql 通过Docker液化-更改日志未写入磁盘
我想为本地(而不是容器中)运行的PostgreSQL数据库设置Liquibase(使用Docker)。我学习了多个教程,包括上一节 根据建议,我在我的Postgresql 通过Docker液化-更改日志未写入磁盘,postgresql,docker,liquibase,Postgresql,Docker,Liquibase,我想为本地(而不是容器中)运行的PostgreSQL数据库设置Liquibase(使用Docker)。我学习了多个教程,包括上一节 根据建议,我在我的中创建了一个liquibase.docker.properties文件 要能够运行docker run--rm--net=“host”-v:/liquibase/changelog liquibase/liquibase--defaultsFile=/liquibase/changelog/liquibase.docker.properties 当
中创建了一个liquibase.docker.properties
文件
要能够运行docker run--rm--net=“host”-v:/liquibase/changelog liquibase/liquibase--defaultsFile=/liquibase/changelog/liquibase.docker.properties
当我运行[…]generateChangeLog
时,我得到以下输出(带有选项--logLevel info
):
[2021-04-27 06:08:20]信息[liquibase.integration]未提供liquibase Pro许可证密钥。请在命令行或liquibase.properties中设置liquibase-prolicenseKey以使用liquibase Pro功能。
Datical的Liquibase Community 4.3.3
####################################################
## _ _ _ _ ##
## | | (_) (_) | ##
## | | _ __ _ _ _ _| |__ __ _ ___ ___ ##
## | | | |/ _` | | | | | '_ \ / _` / __|/ _ \ ##
## | |___| | (_| | |_| | | |_) | (_| \__ \ __/ ##
## \_____/_|\__, |\__,_|_|_.__/ \__,_|___/\___| ##
## | | ##
## |_| ##
## ##
##请访问docs.liquibase.com获取文档##
##在learn.liquibase.com获得认证课程
##免费模式更改活动报告,位于##
## https://hub.liquibase.com ##
## ##
####################################################
06:08:20开始液化(版本4.3.3#52于2021-04-12 17:08+0000构建)
最佳实践:在部署之前,应该检查diffChangeLog/generateChangeLog生成的变更日志的正确性和完整性。
[2021-04-27 06:08:22]信息[liquibase.diff]变更集计数:1
[2021-04-27 06:08:22]信息[liquibase.diff]changelog.xml不存在,正在创建和添加1个变更集。
已成功执行Liquibase命令“generateChangeLog”。
看起来命令运行“成功”但是我在本地目录中找不到我挂载的文件changelog.xml
,即
。但是挂载必须正常,因为它成功连接到数据库,即容器能够访问和读取liquibase.docker.properties
首先,我想我可能不得不“告诉”Docker允许在我的磁盘上写东西,但似乎这应该得到支持[从Docker Hub上的描述]:
/liquibase/changelog卷还可用于写入输出的命令,如generateChangeLog
我错过了什么?提前谢谢你的帮助
其他信息
docker inspect的输出
:
“挂载”:[
{
“类型”:“绑定”,
“来源”:“,
“目的地”:“/液化/变更日志”,
“模式”:“,
“RW”:没错,
“传播”:“rprivate”
},
...
],
TL;DR
在changelog文件名前面加上/liquibase/changelog/
,并将其作为命令行参数传递:
[…]--changeLogFile/liquibase/changelog/changelog.xml generateChangelog
有关详细信息,请参阅
解释
我使用-it
启动了容器,并重写了入口点,以在容器中获得一个交互式shell(请参阅):
docker-run--net=“host”-v:/liquibase/changelog-it--entrypoint/bin/bash-liquibase/liquibase-s
执行ls
会产生以下结果:
liquibase@ubuntu-rafael:/liquibase$ ls
ABOUT.txt UNINSTALL.txt docker-entrypoint.sh liquibase
GETTING_STARTED.txt changelog examples liquibase.bat
LICENSE.txt changelog.txt lib liquibase.docker.properties
README.txt classpath licenses liquibase.jar
这里值得注意的是docker entrypoint.sh
,它实际执行liquibase命令,以及装载到我的本地
的文件夹changelog
(我的.properties
文件在其中)
现在我运行了与以前相同的命令,但现在在容器中:
sh docker-entrypoint.sh--defaultsFile=/liquibase/changelog/liquibase.docker.properties--logLevel info generateChangeLog
我得到了与上面相同的输出,但是猜猜当再次运行ls
时会显示什么:
ABOUT.txt changelog examples liquibase.docker.properties
GETTING_STARTED.txt changelog.txt lib liquibase.jar
LICENSE.txt changelog.xml ...
变更日志实际上存在!但它是在错误的目录中创建的
如果在changelog文件名前面加上/liquibase/changelog/
,则容器可以将其写入本地(装入的)磁盘
这意味着使用中的“属性文件”对“完整示例”的描述不起作用。我将为此打开一个
更新
指定绝对路径仅对写入新文件的命令是必需的,例如
generateChangeLog
(请参阅)。但最好通过命令行传递绝对路径,以便将设置保留在默认文件中。当运行generateChangeLog
时,文件的路径应指定为/liquibase/changelog/changelog.xml
,即使update
需要changelog.xml
例如:
docker run --rm --net="host" -v <PATH TO CHANGELOG DIR>:/liquibase/changelog liquibase/liquibase --defaultsFile=/liquibase/changelog/liquibase.docker.properties --changeLogFile=/liquibase/changelog/changelog.xml generateChangeLog
docker run--rm--net=“host”-v:/liquibase/changelog liquibase/liquibase--defaultsFile=/liquibase/changelog/liquibase.docker.properties--changeLogFile=/liquibase/changelog/changelog.xml generateChangeLog
对于generateChangeLog
,changeLogFile参数是要输出的文件的特定路径,而不是相对于update和其他命令使用的classpath
设置的路径
当您包括命令行参数以及上述的defaultsFile时,命令行参数将获胜。这样,当特定命令需要更多/不同的设置时,您可以利用相同的默认设置来替换特定设置
详细信息
创建文件的操作与创建文件的操作之间存在区别
docker run --rm --net="host" -v <PATH TO CHANGELOG DIR>:/liquibase/changelog liquibase/liquibase --defaultsFile=/liquibase/changelog/liquibase.docker.properties --changeLogFile=/liquibase/changelog/changelog.xml generateChangeLog