Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 通过Docker液化-更改日志未写入磁盘_Postgresql_Docker_Liquibase - Fatal编程技术网

Postgresql 通过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 当

我想为本地(而不是容器中)运行的PostgreSQL数据库设置Liquibase(使用Docker)。我学习了多个教程,包括上一节

根据建议,我在我的
中创建了一个
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