This is an automated email from the ASF dual-hosted git repository.
mbalassi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink-docker.git
The following commit(s) were added to refs/heads/master by this push:
new cfeea17 Add docker build workflow
cfeea17 is described below
commit cfeea17390958606ec56ffd7caaf24dd44263743
Author: Gabor Somogyi <[email protected]>
AuthorDate: Wed Nov 5 15:01:33 2025 +0100
Add docker build workflow
---
.github/workflows/docker_push.yml | 148 ++++++++++++++++++++++++
1.20/scala_2.12-java11-ubuntu/Dockerfile | 6 +-
1.20/scala_2.12-java17-ubuntu/Dockerfile | 6 +-
1.20/scala_2.12-java8-ubuntu/Dockerfile | 6 +-
2.0/scala_2.12-java11-ubuntu/Dockerfile | 6 +-
2.0/scala_2.12-java17-ubuntu/Dockerfile | 6 +-
2.0/scala_2.12-java21-ubuntu/Dockerfile | 6 +-
2.1/scala_2.12-java11-ubuntu/Dockerfile | 6 +-
2.1/scala_2.12-java17-ubuntu/Dockerfile | 6 +-
2.1/scala_2.12-java21-ubuntu/Dockerfile | 6 +-
publish-to-dockerhub.sh | 189 ++++++++++++++++++++++++++-----
11 files changed, 328 insertions(+), 63 deletions(-)
diff --git a/.github/workflows/docker_push.yml
b/.github/workflows/docker_push.yml
new file mode 100644
index 0000000..2cf618c
--- /dev/null
+++ b/.github/workflows/docker_push.yml
@@ -0,0 +1,148 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: "Build and Push Docker Images"
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - master
+ - 'dev-*'
+ tags:
+ - '*-*.*'
+ pull_request:
+ branches:
+ - master
+ - 'dev-*'
+
+env:
+ REGISTRY: ghcr.io
+ OWNER: ${{ github.repository_owner }}
+ IMAGE_REPO: flink-docker
+
+jobs:
+ build_and_push:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ # Flink 1.20.x
+ - flink_version: "1.20"
+ java_version: "8"
+ dockerfile: "1.20/scala_2.12-java8-ubuntu/Dockerfile"
+ - flink_version: "1.20"
+ java_version: "11"
+ dockerfile: "1.20/scala_2.12-java11-ubuntu/Dockerfile"
+ - flink_version: "1.20"
+ java_version: "17"
+ dockerfile: "1.20/scala_2.12-java17-ubuntu/Dockerfile"
+ # Flink 2.0.x
+ - flink_version: "2.0"
+ java_version: "11"
+ dockerfile: "2.0/scala_2.12-java11-ubuntu/Dockerfile"
+ - flink_version: "2.0"
+ java_version: "17"
+ dockerfile: "2.0/scala_2.12-java17-ubuntu/Dockerfile"
+ - flink_version: "2.0"
+ java_version: "21"
+ dockerfile: "2.0/scala_2.12-java21-ubuntu/Dockerfile"
+ # Flink 2.1.x (Latest)
+ - flink_version: "2.1"
+ java_version: "11"
+ dockerfile: "2.1/scala_2.12-java11-ubuntu/Dockerfile"
+ - flink_version: "2.1"
+ java_version: "17"
+ dockerfile: "2.1/scala_2.12-java17-ubuntu/Dockerfile"
+ - flink_version: "2.1"
+ java_version: "21"
+ dockerfile: "2.1/scala_2.12-java21-ubuntu/Dockerfile"
+
+ steps:
+ - name: Check out the repo
+ uses: actions/checkout@v4
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Determine image tags
+ id: meta
+ run: |
+ FLINK_VERSION="${{ matrix.flink_version }}"
+ JAVA_VERSION="${{ matrix.java_version }}"
+
+ # Read full version from Dockerfile (e.g., 2.1.1)
+ # Extract from FLINK_TGZ_URL which contains the version
+ DOCKERFILE_PATH="${{ matrix.dockerfile }}"
+ FULL_VERSION=$(grep "FLINK_TGZ_URL=" "$DOCKERFILE_PATH" | head -1 |
sed -E 's/.*flink-([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
+
+ if [ -z "$FULL_VERSION" ]; then
+ echo "ERROR: Could not extract version from $DOCKERFILE_PATH"
+ exit 1
+ fi
+
+ echo "full_version=$FULL_VERSION" >> $GITHUB_OUTPUT
+
+ # Build base image name
+ BASE_TAG="${FULL_VERSION}-scala_2.12-java${JAVA_VERSION}"
+
+ # Determine tags based on event type
+ TAGS="${REGISTRY}/${OWNER}/${IMAGE_REPO}:${BASE_TAG}"
+
+ # Add branch-specific tags for branch pushes
+ if [ "${{ github.event_name }}" = "push" ] && [ "${{ github.ref_type
}}" = "branch" ]; then
+ BRANCH_NAME=$(echo "${{ github.ref_name }}" | sed 's/\//-/g')
+
TAGS="${TAGS},${REGISTRY}/${OWNER}/${IMAGE_REPO}:${BRANCH_NAME}-java${JAVA_VERSION}"
+
TAGS="${TAGS},${REGISTRY}/${OWNER}/${IMAGE_REPO}:${BRANCH_NAME}-${FLINK_VERSION}-java${JAVA_VERSION}"
+ fi
+
+ # Add git sha tag
+ SHORT_SHA=$(echo "${{ github.sha }}" | cut -c1-7)
+
TAGS="${TAGS},${REGISTRY}/${OWNER}/${IMAGE_REPO}:${BASE_TAG}-${SHORT_SHA}"
+
+ echo "tags=$TAGS" >> $GITHUB_OUTPUT
+ echo "Image tags: $TAGS"
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: ${{ matrix.flink_version }}/scala_2.12-java${{
matrix.java_version }}-ubuntu
+ file: ${{ matrix.dockerfile }}
+ platforms: linux/amd64,linux/arm64/v8
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.meta.outputs.tags }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+ - name: Summary
+ if: github.event_name != 'pull_request'
+ run: |
+ echo "✅ Successfully built and pushed Flink ${{
steps.meta.outputs.full_version }} with Java ${{ matrix.java_version }}"
+ echo "Tags:"
+ echo "${{ steps.meta.outputs.tags }}" | tr ',' '\n' | sed 's/^/ - /'
diff --git a/1.20/scala_2.12-java11-ubuntu/Dockerfile
b/1.20/scala_2.12-java11-ubuntu/Dockerfile
index 7d42611..c34f456 100644
--- a/1.20/scala_2.12-java11-ubuntu/Dockerfile
+++ b/1.20/scala_2.12-java11-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/1.20/scala_2.12-java17-ubuntu/Dockerfile
b/1.20/scala_2.12-java17-ubuntu/Dockerfile
index f14bf3f..48f479d 100644
--- a/1.20/scala_2.12-java17-ubuntu/Dockerfile
+++ b/1.20/scala_2.12-java17-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/1.20/scala_2.12-java8-ubuntu/Dockerfile
b/1.20/scala_2.12-java8-ubuntu/Dockerfile
index b93c6d5..e56083b 100644
--- a/1.20/scala_2.12-java8-ubuntu/Dockerfile
+++ b/1.20/scala_2.12-java8-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/2.0/scala_2.12-java11-ubuntu/Dockerfile
b/2.0/scala_2.12-java11-ubuntu/Dockerfile
index d2be5b6..52c4f2b 100644
--- a/2.0/scala_2.12-java11-ubuntu/Dockerfile
+++ b/2.0/scala_2.12-java11-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/2.0/scala_2.12-java17-ubuntu/Dockerfile
b/2.0/scala_2.12-java17-ubuntu/Dockerfile
index aba51d5..db1918d 100644
--- a/2.0/scala_2.12-java17-ubuntu/Dockerfile
+++ b/2.0/scala_2.12-java17-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/2.0/scala_2.12-java21-ubuntu/Dockerfile
b/2.0/scala_2.12-java21-ubuntu/Dockerfile
index f3d9075..638ec3e 100644
--- a/2.0/scala_2.12-java21-ubuntu/Dockerfile
+++ b/2.0/scala_2.12-java21-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/2.1/scala_2.12-java11-ubuntu/Dockerfile
b/2.1/scala_2.12-java11-ubuntu/Dockerfile
index ec1ee74..799f2b4 100644
--- a/2.1/scala_2.12-java11-ubuntu/Dockerfile
+++ b/2.1/scala_2.12-java11-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/2.1/scala_2.12-java17-ubuntu/Dockerfile
b/2.1/scala_2.12-java17-ubuntu/Dockerfile
index b341586..7822647 100644
--- a/2.1/scala_2.12-java17-ubuntu/Dockerfile
+++ b/2.1/scala_2.12-java17-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/2.1/scala_2.12-java21-ubuntu/Dockerfile
b/2.1/scala_2.12-java21-ubuntu/Dockerfile
index 7e53e5d..172619e 100644
--- a/2.1/scala_2.12-java21-ubuntu/Dockerfile
+++ b/2.1/scala_2.12-java21-ubuntu/Dockerfile
@@ -30,8 +30,7 @@ RUN set -ex; \
wget -nv -O /usr/local/bin/gosu
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture)"; \
wget -nv -O /usr/local/bin/gosu.asc
"https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg
--print-architecture).asc"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
@@ -63,8 +62,7 @@ RUN set -ex; \
if [ "$CHECK_GPG" = "true" ]; then \
wget -nv -O flink.tgz.asc "$FLINK_ASC_URL"; \
export GNUPGHOME="$(mktemp -d)"; \
- for server in ha.pool.sks-keyservers.net $(shuf -e \
- hkp://p80.pool.sks-keyservers.net:80 \
+ for server in hkps://keys.openpgp.org $(shuf -e \
keyserver.ubuntu.com \
hkp://keyserver.ubuntu.com:80 \
pgp.mit.edu) ; do \
diff --git a/publish-to-dockerhub.sh b/publish-to-dockerhub.sh
index 6a73fed..944753c 100755
--- a/publish-to-dockerhub.sh
+++ b/publish-to-dockerhub.sh
@@ -17,45 +17,180 @@
# limitations under the License.
#
-# This script publishes the Flink docker images to any Docker registry. By
default it's configured to the apache/flink DockerHub account.
+# This script copies Flink docker images from GHCR to Docker Hub.
+# It uses crane to efficiently copy images without pulling them locally.
+#
+# Prerequisites:
+# - crane installed
(https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md)
+# - Authentication to Docker Hub (docker login)
+#
+# Usage:
+# ./publish-to-dockerhub.sh [--dry-run]
+# SOURCE_REGISTRY=ghcr.io/myorg/flink-docker TARGET_REGISTRY=myorg/flink
./publish-to-dockerhub.sh
+# ./publish-to-dockerhub.sh --dry-run # Test without actually copying
+
+set -euo pipefail
+
+# Parse command line arguments
+DRY_RUN=false
+for arg in "$@"; do
+ case $arg in
+ --dry-run|-n)
+ DRY_RUN=true
+ shift
+ ;;
+ --help|-h)
+ echo "Usage: $0 [--dry-run]"
+ echo ""
+ echo "Options:"
+ echo " --dry-run, -n Show what would be copied without
actually copying"
+ echo " --help, -h Show this help message"
+ echo ""
+ echo "Environment variables:"
+ echo " SOURCE_REGISTRY Source registry (default:
ghcr.io/apache/flink-docker)"
+ echo " TARGET_REGISTRY Target registry (default: apache/flink)"
+ exit 0
+ ;;
+ *)
+ echo "Unknown option: $arg"
+ echo "Use --help for usage information"
+ exit 1
+ ;;
+ esac
+done
self="$(basename "$BASH_SOURCE")"
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
source common.sh
+# Configuration
+SOURCE_REGISTRY=${SOURCE_REGISTRY:-"ghcr.io/apache/flink-docker"}
TARGET_REGISTRY=${TARGET_REGISTRY:-"apache/flink"}
-echo "Publishing to target registry: $TARGET_REGISTRY"
+echo "============================================"
+echo "Publishing Flink Docker Images"
+if [ "$DRY_RUN" = true ]; then
+ echo "🔍 DRY RUN MODE - No images will be copied"
+fi
+echo "============================================"
+echo "Source: $SOURCE_REGISTRY"
+echo "Target: $TARGET_REGISTRY"
+echo "============================================"
+echo ""
+
+# Confirmation check
+if [ "$DRY_RUN" = false ]; then
+ echo "⚠️ IMPORTANT: Before running this script, ensure that:"
+ echo ""
+ echo "1. The GitHub Actions workflow 'Build and Push Docker Images' has"
+ echo " completed successfully for the release you want to publish"
+ echo ""
+ echo "2. All Docker images are available in GHCR at:"
+ echo " https://github.com/orgs/apache/packages?repo_name=flink-docker"
+ echo " (or https://github.com/users/${USER}/packages if using a fork)"
+ echo ""
+ echo "3. The images were built from the correct branch/tag"
+ echo " - For releases: master branch"
+ echo " - For testing: dev-* branches"
+ echo ""
+ echo "4. You are authenticated to Docker Hub:"
+ echo " docker login"
+ echo ""
+ read -p "Have you verified the above? (yes/no): " -r
+ echo ""
+ if [[ ! $REPLY =~ ^[Yy][Ee][Ss]$ ]]; then
+ echo "❌ Aborted. Please verify the build workflow completed
successfully first."
+ exit 1
+ fi
+
+ echo "✅ Proceeding with image publication..."
+ echo ""
+else
+ echo "🔍 Dry-run mode: Will verify images exist and show what would be
copied"
+ echo ""
+fi
+
+# Check if crane is installed
+if ! command -v crane &> /dev/null; then
+ echo "ERROR: crane is not installed"
+ echo "Please install crane from:
https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md"
+ echo ""
+ echo "Quick install:"
+ echo " macOS: brew install crane"
+ echo " Linux: go install
github.com/google/go-containerregistry/cmd/crane@latest"
+ exit 1
+fi
+
+# Process each Dockerfile
+for dockerfile in $(find . -name "Dockerfile" | sort); do
+ dir=$(dirname "$dockerfile")
-for dockerfile in $(find . -name "Dockerfile"); do
- dir=$(dirname $dockerfile)
+ # Extract version and java version from Dockerfile
+ FLINK_VERSION=$(grep "FLINK_TGZ_URL=" "$dockerfile" | head -1 | sed -E
's/.*flink-([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
+ # Extract java version from directory name (e.g., scala_2.12-java11-ubuntu
-> java11)
+ JAVA_VERSION=$(basename "$dir" | sed -E 's/.*-java([0-9]+)-.*/\1/')
+
+ if [ -z "$FLINK_VERSION" ] || [ -z "$JAVA_VERSION" ]; then
+ echo "⚠️ Skipping $dir - could not extract version info"
+ continue
+ fi
+
+ # Construct source image tag
+ SOURCE_TAG="${FLINK_VERSION}-scala_2.12-java${JAVA_VERSION}"
+ SOURCE_IMAGE="${SOURCE_REGISTRY}:${SOURCE_TAG}"
+
+ # Read target tags from metadata
metadata="$dir/release.metadata"
- tags=$(extractValue "Tags" $metadata)
- tags=$(pruneTags "$tags" $latest_version)
+ if [ ! -f "$metadata" ]; then
+ echo "⚠️ Skipping $dir - no metadata file found"
+ continue
+ fi
+
+ tags=$(extractValue "Tags" "$metadata")
+ tags=$(pruneTags "$tags" "$latest_version")
- echo "Building image in $dir"
+ echo "📦 Processing Flink ${FLINK_VERSION} Java ${JAVA_VERSION}"
+ echo " Source: ${SOURCE_IMAGE}"
- DOCKER_BUILD_CMD="docker build"
- DOCKER_PUSH_CMDS=()
+ # Check if source image exists
+ if ! crane manifest "$SOURCE_IMAGE" &> /dev/null; then
+ echo " ❌ ERROR: Source image not found in GHCR"
+ echo " Please ensure the image was built and pushed by the CI
workflow"
+ echo ""
+ echo "Aborting: Cannot proceed with missing images"
+ exit 1
+ fi
+
+ # Copy to each target tag
IFS=',' read -ra TAGS_ARRAY <<< "$tags"
- for raw_tag in "${TAGS_ARRAY[@]}"; do
- # trim whitespace
- tag=`echo $raw_tag | xargs`
- DOCKER_BUILD_CMD+=" -t $TARGET_REGISTRY:$tag"
- DOCKER_PUSH_CMDS+=( "docker push $TARGET_REGISTRY:$tag")
- done
- DOCKER_BUILD_CMD+=" $dir"
- echo -e "\tBuilding docker image using command"
- echo -e "\t\t$DOCKER_BUILD_CMD"
- eval $DOCKER_BUILD_CMD
- echo -e "\tPushing tags"
- for push_cmd in "${DOCKER_PUSH_CMDS[@]}"; do
- echo -e "\t\tPushing using $push_cmd"
- eval $push_cmd
- done
-
- #newline
- echo
+ for raw_tag in "${TAGS_ARRAY[@]}"; do
+ # Trim whitespace
+ tag=$(echo "$raw_tag" | xargs)
+ TARGET_IMAGE="${TARGET_REGISTRY}:${tag}"
+
+ if [ "$DRY_RUN" = true ]; then
+ echo " 🔍 Would copy to ${TARGET_IMAGE}"
+ else
+ echo " 📤 Copying to ${TARGET_IMAGE}"
+ if crane copy "$SOURCE_IMAGE" "$TARGET_IMAGE"; then
+ echo " ✅ Success"
+ else
+ echo " ❌ Failed"
+ exit 1
+ fi
+ fi
+ done
+
+ echo ""
done
+
+echo "============================================"
+if [ "$DRY_RUN" = true ]; then
+ echo "🔍 Dry-run completed successfully!"
+ echo "Run without --dry-run to actually copy images."
+else
+ echo "✅ All images published successfully!"
+fi
+echo "============================================"