通过 Docker 的 Liquibase - 更改日志未写入磁盘

Raf*_*-WO 5 postgresql liquibase docker

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

按照建议,我liquibase.docker.properties在我的中创建了一个文件<PATH TO CHANGELOG DIR>

classpath: /liquibase/changelog
url: jdbc:postgresql://localhost:5432/mydb?currentSchema=public
changeLogFile: changelog.xml
username: myuser
password: mypass
Run Code Online (Sandbox Code Playgroud)

才能跑docker run --rm --net="host" -v <PATH TO CHANGELOG DIR>:/liquibase/changelog liquibase/liquibase --defaultsFile=/liquibase/changelog/liquibase.docker.properties <COMMAND>

当我运行时[...] generateChangeLog,我得到以下输出(带有选项--logLevel info):

classpath: /liquibase/changelog
url: jdbc:postgresql://localhost:5432/mydb?currentSchema=public
changeLogFile: changelog.xml
username: myuser
password: mypass
Run Code Online (Sandbox Code Playgroud)

看起来命令“成功”运行,但我无法changelog.xml在我安装的本地目录中找到该文件,即<PATH TO CHANGELOG DIR>. 然而,安装必须有效,因为它已成功连接到数据库,即容器能够访问和读取liquibase.docker.properties.

首先,我想我可能必须对 Docker “说”它可以在我的磁盘上写入,但似乎应该支持这一点 [来自 Docker Hub 上的描述]:

/liquibase/changelog 卷还可用于写入输出的命令,例如generateChangeLog

我缺少什么?预先感谢您的任何帮助!


附加信息

输出docker inspect

[2021-04-27 06:08:20] INFO [liquibase.integration] No Liquibase Pro license key supplied. Please set liquibaseProLicenseKey on command line or in liquibase.properties to use Liquibase Pro features.
Liquibase Community 4.3.3 by Datical
####################################################
##   _     _             _ _                      ##
##  | |   (_)           (_) |                     ##
##  | |    _  __ _ _   _ _| |__   __ _ ___  ___   ##
##  | |   | |/ _` | | | | | '_ \ / _` / __|/ _ \  ##
##  | |___| | (_| | |_| | | |_) | (_| \__ \  __/  ##
##  \_____/_|\__, |\__,_|_|_.__/ \__,_|___/\___|  ##
##              | |                               ##
##              |_|                               ##
##                                                ## 
##  Get documentation at docs.liquibase.com       ##
##  Get certified courses at learn.liquibase.com  ## 
##  Free schema change activity reports at        ##
##      https://hub.liquibase.com                 ##
##                                                ##
####################################################
Starting Liquibase at 06:08:20 (version 4.3.3 #52 built at 2021-04-12 17:08+0000)
BEST PRACTICE: The changelog generated by diffChangeLog/generateChangeLog should be inspected for correctness and completeness before being deployed.
[2021-04-27 06:08:22] INFO [liquibase.diff] changeSets count: 1
[2021-04-27 06:08:22] INFO [liquibase.diff] changelog.xml does not exist, creating and adding 1 changesets.
Liquibase command 'generateChangeLog' was executed successfully.
Run Code Online (Sandbox Code Playgroud)

Nat*_*and 3

当您运行时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
Run Code Online (Sandbox Code Playgroud)

对于generateChangeLog,changeLogFile 参数是要输出的文件的特定路径与相对于classpathupdate 和其他命令使用的设置的路径。

当您包含命令行参数以及像上面这样的 defaultsFile 时,命令行参数获胜。这使您可以利用相同的默认设置,同时在特定命令需要更多/不同的设置时替换特定设置。

细节

创建文件的操作和读取现有文件的操作之间存在区别。

使用 Liquibase,您几乎总是希望使用与类路径中的目录相关的文件路径,如示例所示。指定的变更日志文件存储在跟踪系统中,因此如果您运行相同的变更日志但以不同的方式引用(因为您移动了根目录或从不同的计算机运行),那么 Liquibase 会将其视为新文件并尝试重新运行已经运行的变更集。

这就是文档中有classpath: /liquibase/changelog和的原因changeLogFile: com/example/changelog.xml。该update操作在 /liquibase/changelog 目录中查找名为 的文件com/example/changelog.xml,并找到它并将路径存储为com/example/changelog.xml.

GenerateChangeLog 是“并不总是与类路径相关”的情况之一,因为它需要知道在哪里存储文件。如果您只是在创建时指定输出changeLogFile,changelog.xml则只会创建相对于进程工作目录的文件,这不是您需要/期望的。