From 4f39137e59cdbaab0093bca24ccb882342b262b0 Mon Sep 17 00:00:00 2001 From: Alejandro Alvarez Date: Fri, 27 Jun 2025 11:45:33 +0200 Subject: [PATCH 1/5] Add liqubase-pro docs --- liquibase-pro/README-short.txt | 1 + liquibase-pro/content.md | 238 +++++++++++++++++++++++++++++++++ liquibase-pro/github-repo | 1 + liquibase-pro/license.md | 11 ++ liquibase-pro/logo.png | Bin 0 -> 39491 bytes liquibase-pro/maintainer.md | 1 + liquibase-pro/metadata.json | 7 + 7 files changed, 259 insertions(+) create mode 100644 liquibase-pro/README-short.txt create mode 100644 liquibase-pro/content.md create mode 100644 liquibase-pro/github-repo create mode 100644 liquibase-pro/license.md create mode 100644 liquibase-pro/logo.png create mode 100644 liquibase-pro/maintainer.md create mode 100644 liquibase-pro/metadata.json diff --git a/liquibase-pro/README-short.txt b/liquibase-pro/README-short.txt new file mode 100644 index 000000000000..7db17172097b --- /dev/null +++ b/liquibase-pro/README-short.txt @@ -0,0 +1 @@ +Liquibase Pro is DevOps for your database. \ No newline at end of file diff --git a/liquibase-pro/content.md b/liquibase-pro/content.md new file mode 100644 index 000000000000..b170f57d6d41 --- /dev/null +++ b/liquibase-pro/content.md @@ -0,0 +1,238 @@ +# Official Liquibase-Pro Docker Images + +**Liquibase Pro** is the enterprise edition of Liquibase that provides advanced database DevOps capabilities for teams requiring enhanced security, performance, and governance features. + +## ⚠️ License Requirements + +> **WARNING**: Liquibase Pro requires a valid license key to use Pro features. Without a license, the container will run in Liquibase Community mode with limited functionality. +> +> - Contact [Liquibase Sales](https://www.liquibase.com/community/contact) to obtain a Pro license +> - Existing customers receive their Pro license keys in an email. + +## 📋 Pro Features + +Liquibase Pro is the enterprise edition of [Liquibase](https://www.liquibase.com/) that provides advanced database DevOps capabilities for teams requiring enhanced security, performance, and governance features. + +Liquibase Pro includes all Community features plus: + +### 🔐 Security & Governance + +- **Policy Checks**: Enforce database standards and best practices +- **Quality Checks**: Advanced validation rules for changesets +- **Rollback SQL**: Generate rollback scripts for any deployment +- **Targeted Rollback**: Rollback specific changesets without affecting others +- **Advanced Database Support**: Enhanced support for Oracle, SQL Server, and other enterprise databases +- **Audit Reports**: Comprehensive tracking of database changes +- **Stored Logic**: Support for functions, procedures, packages, and triggers + +## 🔧 Environment Variables + +### Pro License Environment Variable + +| Variable | Description | Example | +|----------|-------------|---------| +| `LIQUIBASE_LICENSE_KEY` | Your Liquibase Pro license key | `ABcd-1234-EFGH-5678` | + +### 🔧 Action Required + +Please update your Dockerfiles and scripts to pull from the new official image: + +## Available Registries + +We publish this image to multiple registries: + +| Registry | Pro Image | +|----------|-----------| +| **Docker Hub (default)** | `liquibase/liquibase-pro` | +| **GitHub Container Registry** | `ghcr.io/liquibase/liquibase-pro` | +| **Amazon ECR Public** | `public.ecr.aws/liquibase/liquibase-pro` | + +## Dockerfile + +```dockerfile +FROM liquibase/liquibase-pro:latest +# OR ghcr.io/liquibase/liquibase-pro:latest # GHCR +# OR public.ecr.aws/liquibase/liquibase-pro:latest # Amazon ECR Public +``` + +## Scripts + +### Pro Edition + +```bash +# Docker Hub (default) +docker pull liquibase/liquibase-pro + +# GitHub Container Registry +docker pull ghcr.io/liquibase/liquibase-pro + +# Amazon ECR Public +docker pull public.ecr.aws/liquibase/liquibase-pro +``` + +### Pulling the Latest or Specific Version + +#### Pulling Pro Edition Images + +```bash +# Latest +docker pull liquibase/liquibase-pro:latest +docker pull ghcr.io/liquibase/liquibase-pro:latest +docker pull public.ecr.aws/liquibase/liquibase-pro:latest + +# Specific version (example: 4.32.0) +docker pull liquibase/liquibase-pro:4.32.0 +docker pull ghcr.io/liquibase/liquibase-pro:4.32.0 +docker pull public.ecr.aws/liquibase/liquibase-pro:4.32.0 +``` + +For any questions or support, please visit our [Liquibase Community Forum](https://forum.liquibase.org/). + +## 🏷️ Supported Tags + +The following tags are officially supported and can be found on [Docker Hub](https://hub.docker.com/r/liquibase/liquibase-pro/tags): + +- `liquibase/liquibase-pro:` + +### Database Connection Variables + +| Variable | Description | Example | +|----------|-------------|---------| +| `LIQUIBASE_COMMAND_URL` | Database JDBC URL | `jdbc:postgresql://db:5432/mydb` | +| `LIQUIBASE_COMMAND_USERNAME` | Database username | `dbuser` | +| `LIQUIBASE_COMMAND_PASSWORD` | Database password | `dbpass` | +| `LIQUIBASE_COMMAND_CHANGELOG_FILE` | Path to changelog file | `/liquibase/changelog/changelog.xml` | + +### Pro-Specific Configuration + +| Variable | Description | Default | +|----------|-------------|---------| +| `LIQUIBASE_PRO_POLICY_CHECKS_ENABLED` | Enable policy checks | `true` | +| `LIQUIBASE_PRO_QUALITY_CHECKS_ENABLED` | Enable quality checks | `true` | +| `LIQUIBASE_REPORTS_ENABLED` | Enable HTML reports | `true` | +| `LIQUIBASE_REPORTS_PATH` | Reports output directory | `/tmp/reports` | + +## Required License Configuration + +Set your Liquibase Pro license key using the `LIQUIBASE_LICENSE_KEY` environment variable: + +```bash +$ docker run --rm \ + -e LIQUIBASE_LICENSE_KEY="YOUR_LICENSE_KEY_HERE" \ + -v /path/to/changelog:/liquibase/changelog \ + liquibase/liquibase-pro \ + --changelog-file=example-changelog.xml \ + --url="jdbc:postgresql://host.docker.internal:5432/testdb" \ + --username=postgres \ + --password=password \ + --search-path=/liquibase/changelog/ \ + update +``` + +## Mounting Changelog Files + +Mount your changelog directory to the `/liquibase/changelog` volume and use the `--search-path` parameter to specify the location. + +```bash +$ docker run --rm \ + -e LIQUIBASE_LICENSE_KEY="YOUR_LICENSE_KEY_HERE" \ + -v "$(pwd)":/liquibase/changelog \ + liquibase/liquibase-pro \ + --changelog-file=example-changelog.xml \ + --search-path=/liquibase/changelog/ \ + update +``` + +## Using a Properties File + +To use a default configuration file, mount it in your changelog volume and reference it with the `--defaults-file` argument. + +```bash +$ docker run --rm \ + -e LIQUIBASE_LICENSE_KEY="YOUR_LICENSE_KEY_HERE" \ + -v /path/to/changelog:/liquibase/changelog \ + liquibase/liquibase-pro \ + --defaults-file=liquibase.properties update +``` + +Example `liquibase.properties` file: + +```bash +url=jdbc:postgresql://host.docker.internal:5432/testdb +username=postgres +password=password +changelog-file=example-changelog.xml +search-path=/liquibase/changelog/ +licenseKey= +``` + +## Adding Additional JARs + +Mount a local directory containing additional jars to `/liquibase/lib`. + +```bash +$ docker run --rm \ + -e LIQUIBASE_LICENSE_KEY="YOUR_LICENSE_KEY_HERE" \ + -v /path/to/changelog:/liquibase/changelog \ + -v /path/to/lib:/liquibase/lib \ + liquibase/liquibase-pro update + +## 📦 Using the Docker Image + +### 🏷️ Standard Image + +The `liquibase/liquibase-pro:` image is the standard choice. Use it as a disposable container or a foundational building block for other images. + +For examples of extending the standard image, see the [standard image examples](https://github.com/liquibase/docker/tree/main/examples). + + +**Usage:** + +```bash +# Build the image +docker build . -t liquibase-pro-aws + +# Run with AWS credentials +docker run --rm \ + -e AWS_ACCESS_KEY_ID="your-access-key" \ + -e AWS_SECRET_ACCESS_KEY="your-secret-key" \ + -e LIQUIBASE_LICENSE_KEY="your-license-key" \ + -v "$(pwd)":/liquibase/changelog \ + liquibase-pro-aws \ + --changelog-file=changelog.xml \ + --search-path=/liquibase/changelog/ \ + update +``` + +### 🐳 Docker Compose Example + +For a complete example using Docker Compose with PostgreSQL: + +```yaml +version: '3.8' +services: + liquibase: + image: liquibase/liquibase-pro:latest + environment: + LIQUIBASE_LICENSE_KEY: "${LIQUIBASE_LICENSE_KEY}" + LIQUIBASE_COMMAND_URL: "jdbc:postgresql://postgres:5432/example" + LIQUIBASE_COMMAND_USERNAME: "liquibase" + LIQUIBASE_COMMAND_PASSWORD: "liquibase" + LIQUIBASE_COMMAND_CHANGELOG_FILE: "changelog.xml" + volumes: + - ./changelog:/liquibase/changelog + depends_on: + - postgres + command: update + + postgres: + image: postgres:15 + environment: + POSTGRES_DB: example + POSTGRES_USER: liquibase + POSTGRES_PASSWORD: liquibase + ports: + - "5432:5432" +``` + + diff --git a/liquibase-pro/github-repo b/liquibase-pro/github-repo new file mode 100644 index 000000000000..2d758d9c20e6 --- /dev/null +++ b/liquibase-pro/github-repo @@ -0,0 +1 @@ +https://github.com/liquibase/docker diff --git a/liquibase-pro/license.md b/liquibase-pro/license.md new file mode 100644 index 000000000000..4b852314c592 --- /dev/null +++ b/liquibase-pro/license.md @@ -0,0 +1,11 @@ +This Docker image contains Liquibase Pro software which requires a valid commercial license for use. + +For licensing questions, please contact [Liquibase Sales](https://www.liquibase.com/contact). + +View [license information](https://www.liquibase.com/eula) for the software contained in this image. + +As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained). + +Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `liquibase/` directory](https://github.com/docker-library/repo-info/tree/master/repos/liquibase). + +As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within. \ No newline at end of file diff --git a/liquibase-pro/logo.png b/liquibase-pro/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9f6d31750b24aff850e96686f011f4a6b49f7172 GIT binary patch literal 39491 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 literal 0 HcmV?d00001 diff --git a/liquibase-pro/maintainer.md b/liquibase-pro/maintainer.md new file mode 100644 index 000000000000..43a5852a9422 --- /dev/null +++ b/liquibase-pro/maintainer.md @@ -0,0 +1 @@ +[Liquibase](%%GITHUB-REPO%%) diff --git a/liquibase-pro/metadata.json b/liquibase-pro/metadata.json new file mode 100644 index 000000000000..67e782480585 --- /dev/null +++ b/liquibase-pro/metadata.json @@ -0,0 +1,7 @@ +{ + "hub": { + "categories": [ + "developer-tools" + ] + } +} From 7901754494569c1862f8bce78e391c36683d120c Mon Sep 17 00:00:00 2001 From: Alejandro Alvarez Date: Fri, 27 Jun 2025 11:55:36 +0200 Subject: [PATCH 2/5] Fix code block formatting in Docker usage example --- liquibase-pro/content.md | 1 + 1 file changed, 1 insertion(+) diff --git a/liquibase-pro/content.md b/liquibase-pro/content.md index b170f57d6d41..cb3f71e2d705 100644 --- a/liquibase-pro/content.md +++ b/liquibase-pro/content.md @@ -176,6 +176,7 @@ $ docker run --rm \ -v /path/to/changelog:/liquibase/changelog \ -v /path/to/lib:/liquibase/lib \ liquibase/liquibase-pro update +``` ## 📦 Using the Docker Image From 658b9d1ff4428ff3460e8712069df616a4366e91 Mon Sep 17 00:00:00 2001 From: Alejandro Alvarez Date: Fri, 27 Jun 2025 11:59:32 +0200 Subject: [PATCH 3/5] Update docs to use liquibase-pro as official Docker image Switch all references from liquibase/liquibase-pro and other registry-specific tags to the new liquibase-pro image. Update examples, instructions, and links to reflect the new official image. --- liquibase-pro/content.md | 46 ++++++++++++---------------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/liquibase-pro/content.md b/liquibase-pro/content.md index cb3f71e2d705..c01bec5e3837 100644 --- a/liquibase-pro/content.md +++ b/liquibase-pro/content.md @@ -37,22 +37,14 @@ Liquibase Pro includes all Community features plus: Please update your Dockerfiles and scripts to pull from the new official image: -## Available Registries - -We publish this image to multiple registries: - | Registry | Pro Image | |----------|-----------| -| **Docker Hub (default)** | `liquibase/liquibase-pro` | -| **GitHub Container Registry** | `ghcr.io/liquibase/liquibase-pro` | -| **Amazon ECR Public** | `public.ecr.aws/liquibase/liquibase-pro` | +| **Docker Hub (default)** | `liquibase-pro` | ## Dockerfile ```dockerfile -FROM liquibase/liquibase-pro:latest -# OR ghcr.io/liquibase/liquibase-pro:latest # GHCR -# OR public.ecr.aws/liquibase/liquibase-pro:latest # Amazon ECR Public +FROM liquibase-pro:latest ``` ## Scripts @@ -60,14 +52,8 @@ FROM liquibase/liquibase-pro:latest ### Pro Edition ```bash -# Docker Hub (default) -docker pull liquibase/liquibase-pro - -# GitHub Container Registry -docker pull ghcr.io/liquibase/liquibase-pro - -# Amazon ECR Public -docker pull public.ecr.aws/liquibase/liquibase-pro +# Docker Hub +docker pull liquibase-pro ``` ### Pulling the Latest or Specific Version @@ -76,23 +62,19 @@ docker pull public.ecr.aws/liquibase/liquibase-pro ```bash # Latest -docker pull liquibase/liquibase-pro:latest -docker pull ghcr.io/liquibase/liquibase-pro:latest -docker pull public.ecr.aws/liquibase/liquibase-pro:latest +docker pull liquibase-pro:latest # Specific version (example: 4.32.0) -docker pull liquibase/liquibase-pro:4.32.0 -docker pull ghcr.io/liquibase/liquibase-pro:4.32.0 -docker pull public.ecr.aws/liquibase/liquibase-pro:4.32.0 +docker pull liquibase-pro:4.32.0 ``` For any questions or support, please visit our [Liquibase Community Forum](https://forum.liquibase.org/). ## 🏷️ Supported Tags -The following tags are officially supported and can be found on [Docker Hub](https://hub.docker.com/r/liquibase/liquibase-pro/tags): +The following tags are officially supported and can be found on [Docker Hub](https://hub.docker.com/_/liquibase-pro/tags): -- `liquibase/liquibase-pro:` +- `liquibase-pro:` ### Database Connection Variables @@ -120,7 +102,7 @@ Set your Liquibase Pro license key using the `LIQUIBASE_LICENSE_KEY` environment $ docker run --rm \ -e LIQUIBASE_LICENSE_KEY="YOUR_LICENSE_KEY_HERE" \ -v /path/to/changelog:/liquibase/changelog \ - liquibase/liquibase-pro \ + liquibase-pro \ --changelog-file=example-changelog.xml \ --url="jdbc:postgresql://host.docker.internal:5432/testdb" \ --username=postgres \ @@ -137,7 +119,7 @@ Mount your changelog directory to the `/liquibase/changelog` volume and use the $ docker run --rm \ -e LIQUIBASE_LICENSE_KEY="YOUR_LICENSE_KEY_HERE" \ -v "$(pwd)":/liquibase/changelog \ - liquibase/liquibase-pro \ + liquibase-pro \ --changelog-file=example-changelog.xml \ --search-path=/liquibase/changelog/ \ update @@ -151,7 +133,7 @@ To use a default configuration file, mount it in your changelog volume and refer $ docker run --rm \ -e LIQUIBASE_LICENSE_KEY="YOUR_LICENSE_KEY_HERE" \ -v /path/to/changelog:/liquibase/changelog \ - liquibase/liquibase-pro \ + liquibase-pro \ --defaults-file=liquibase.properties update ``` @@ -175,14 +157,14 @@ $ docker run --rm \ -e LIQUIBASE_LICENSE_KEY="YOUR_LICENSE_KEY_HERE" \ -v /path/to/changelog:/liquibase/changelog \ -v /path/to/lib:/liquibase/lib \ - liquibase/liquibase-pro update + liquibase-pro update ``` ## 📦 Using the Docker Image ### 🏷️ Standard Image -The `liquibase/liquibase-pro:` image is the standard choice. Use it as a disposable container or a foundational building block for other images. +The `liquibase-pro:` image is the standard choice. Use it as a disposable container or a foundational building block for other images. For examples of extending the standard image, see the [standard image examples](https://github.com/liquibase/docker/tree/main/examples). @@ -213,7 +195,7 @@ For a complete example using Docker Compose with PostgreSQL: version: '3.8' services: liquibase: - image: liquibase/liquibase-pro:latest + image: liquibase-pro:latest environment: LIQUIBASE_LICENSE_KEY: "${LIQUIBASE_LICENSE_KEY}" LIQUIBASE_COMMAND_URL: "jdbc:postgresql://postgres:5432/example" From 2bb792586ff48a31b8cd07ec5b828640712edd36 Mon Sep 17 00:00:00 2001 From: Alejandro Alvarez Date: Fri, 27 Jun 2025 12:06:32 +0200 Subject: [PATCH 4/5] Fix Markdown list and table formatting for consistency --- liquibase-pro/content.md | 53 +++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/liquibase-pro/content.md b/liquibase-pro/content.md index c01bec5e3837..1715c4f61d6c 100644 --- a/liquibase-pro/content.md +++ b/liquibase-pro/content.md @@ -6,8 +6,8 @@ > **WARNING**: Liquibase Pro requires a valid license key to use Pro features. Without a license, the container will run in Liquibase Community mode with limited functionality. > -> - Contact [Liquibase Sales](https://www.liquibase.com/community/contact) to obtain a Pro license -> - Existing customers receive their Pro license keys in an email. +> - Contact [Liquibase Sales](https://www.liquibase.com/community/contact) to obtain a Pro license +> - Existing customers receive their Pro license keys in an email. ## 📋 Pro Features @@ -17,28 +17,28 @@ Liquibase Pro includes all Community features plus: ### 🔐 Security & Governance -- **Policy Checks**: Enforce database standards and best practices -- **Quality Checks**: Advanced validation rules for changesets -- **Rollback SQL**: Generate rollback scripts for any deployment -- **Targeted Rollback**: Rollback specific changesets without affecting others -- **Advanced Database Support**: Enhanced support for Oracle, SQL Server, and other enterprise databases -- **Audit Reports**: Comprehensive tracking of database changes -- **Stored Logic**: Support for functions, procedures, packages, and triggers +- **Policy Checks**: Enforce database standards and best practices +- **Quality Checks**: Advanced validation rules for changesets +- **Rollback SQL**: Generate rollback scripts for any deployment +- **Targeted Rollback**: Rollback specific changesets without affecting others +- **Advanced Database Support**: Enhanced support for Oracle, SQL Server, and other enterprise databases +- **Audit Reports**: Comprehensive tracking of database changes +- **Stored Logic**: Support for functions, procedures, packages, and triggers ## 🔧 Environment Variables ### Pro License Environment Variable -| Variable | Description | Example | -|----------|-------------|---------| +| Variable | Description | Example | +|-------------------------|--------------------------------|-----------------------| | `LIQUIBASE_LICENSE_KEY` | Your Liquibase Pro license key | `ABcd-1234-EFGH-5678` | ### 🔧 Action Required Please update your Dockerfiles and scripts to pull from the new official image: -| Registry | Pro Image | -|----------|-----------| +| Registry | Pro Image | +|--------------------------|-----------------| | **Docker Hub (default)** | `liquibase-pro` | ## Dockerfile @@ -74,25 +74,25 @@ For any questions or support, please visit our [Liquibase Community Forum](https The following tags are officially supported and can be found on [Docker Hub](https://hub.docker.com/_/liquibase-pro/tags): -- `liquibase-pro:` +- `liquibase-pro:` ### Database Connection Variables -| Variable | Description | Example | -|----------|-------------|---------| -| `LIQUIBASE_COMMAND_URL` | Database JDBC URL | `jdbc:postgresql://db:5432/mydb` | -| `LIQUIBASE_COMMAND_USERNAME` | Database username | `dbuser` | -| `LIQUIBASE_COMMAND_PASSWORD` | Database password | `dbpass` | +| Variable | Description | Example | +|------------------------------------|------------------------|--------------------------------------| +| `LIQUIBASE_COMMAND_URL` | Database JDBC URL | `jdbc:postgresql://db:5432/mydb` | +| `LIQUIBASE_COMMAND_USERNAME` | Database username | `dbuser` | +| `LIQUIBASE_COMMAND_PASSWORD` | Database password | `dbpass` | | `LIQUIBASE_COMMAND_CHANGELOG_FILE` | Path to changelog file | `/liquibase/changelog/changelog.xml` | ### Pro-Specific Configuration -| Variable | Description | Default | -|----------|-------------|---------| -| `LIQUIBASE_PRO_POLICY_CHECKS_ENABLED` | Enable policy checks | `true` | -| `LIQUIBASE_PRO_QUALITY_CHECKS_ENABLED` | Enable quality checks | `true` | -| `LIQUIBASE_REPORTS_ENABLED` | Enable HTML reports | `true` | -| `LIQUIBASE_REPORTS_PATH` | Reports output directory | `/tmp/reports` | +| Variable | Description | Default | +|----------------------------------------|--------------------------|----------------| +| `LIQUIBASE_PRO_POLICY_CHECKS_ENABLED` | Enable policy checks | `true` | +| `LIQUIBASE_PRO_QUALITY_CHECKS_ENABLED` | Enable quality checks | `true` | +| `LIQUIBASE_REPORTS_ENABLED` | Enable HTML reports | `true` | +| `LIQUIBASE_REPORTS_PATH` | Reports output directory | `/tmp/reports` | ## Required License Configuration @@ -168,7 +168,6 @@ The `liquibase-pro:` image is the standard choice. Use it as a disposab For examples of extending the standard image, see the [standard image examples](https://github.com/liquibase/docker/tree/main/examples). - **Usage:** ```bash @@ -217,5 +216,3 @@ services: ports: - "5432:5432" ``` - - From fdb5529ffb52902838e26df6bd0d03fe4ff9d0fc Mon Sep 17 00:00:00 2001 From: Alejandro Alvarez Date: Fri, 27 Jun 2025 12:08:23 +0200 Subject: [PATCH 5/5] Add missing newline at end of license.md file --- liquibase-pro/license.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liquibase-pro/license.md b/liquibase-pro/license.md index 4b852314c592..ac6446338fd5 100644 --- a/liquibase-pro/license.md +++ b/liquibase-pro/license.md @@ -8,4 +8,4 @@ As with all Docker images, these likely also contain other software which may be Some additional license information which was able to be auto-detected might be found in [the `repo-info` repository's `liquibase/` directory](https://github.com/docker-library/repo-info/tree/master/repos/liquibase). -As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within. \ No newline at end of file +As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.