diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 18c0942832fd41f7c68a9d1bdda8554fc94e11ae..5ab649ca02ec255d579ca38c14b40a8c2502b3e6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,8 +20,11 @@ variables:
   DOCKER_BUILDKIT: 1
 
   ## Dockerhub registry
-  DH_REGISTRY: eicweb
+  DH_REGISTRY_USER: eicweb
   DH_PUSH: 1
+  ## GitHub registry
+  GH_REGISTRY: ghcr.io
+  GH_PUSH: 1
 
   ## Also export the raw builder image, will be stored on DH only
   EXPORT_BUILDER: 0
@@ -48,12 +51,16 @@ stages:
 
 default:
   before_script:
-    - ./gitlab-ci/docker_login.sh -u $DH_REGISTRY -p $DH_EICWEB_TOKEN
-                                  -n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
-    - ./gitlab-ci/docker_login.sh --ci -n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
+    - ./gitlab-ci/docker_login.sh -u ${DH_REGISTRY_USER} -p ${DH_EICWEB_TOKEN}
+                                  -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
+    - ./gitlab-ci/docker_login.sh -u ${GITHUB_REGISTRY_USER} -p ${GITHUB_REGISTRY_TOKEN}
+                                  -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
+                                  ${GH_REGISTRY}
+    - ./gitlab-ci/docker_login.sh --ci -n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
   after_script:
     - docker logout
     - docker logout ${CI_REGISTRY}
+    - docker logout ${GH_REGISTRY}
 
 ## only run CI for in the following cases:
 ## master, stable branch, release tag, MR event and nightly builds
@@ -417,6 +424,9 @@ jug_xl:nightly:
                                  -n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
                                  ${NIGHTLY_TAG} ${PUSH_FLAG}
     - if [ -z "${PUSH_FLAG}" ] ; then 
+      ./gitlab-ci/docker_push.sh -i ${BUILD_IMAGE} -l ${NIGHTLY_TAG} 
+                                 -n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
+                                 ${NIGHTLY_TAG}-$(date +%Y-%m-%d) --ghcr ;
       ./gitlab-ci/docker_push.sh -i ${BUILD_IMAGE} -l ${NIGHTLY_TAG} 
                                  -n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
                                  ${NIGHTLY_TAG}-$(date +%Y-%m-%d) --dockerhub ;
diff --git a/gitlab-ci/docker_login.sh b/gitlab-ci/docker_login.sh
index 037b064505b9b29901808e8d0501924d670a6d92..1d495a65fb4a07937450f54d6de3526955b4a5e8 100755
--- a/gitlab-ci/docker_login.sh
+++ b/gitlab-ci/docker_login.sh
@@ -89,7 +89,8 @@ fi
 
 while [ $NTRIES != 0 ]; do
   if [ -z $CI ]; then
-    echo $REG_PASSWORD | docker login -u $REG_USER --password-stdin \
+    echo $REG_PASSWORD | docker login -u $REG_USER \
+                                     --password-stdin $REGISTRY \
       && break \
       || echo "Login failed, retrying in $TIME seconds..."
   else
diff --git a/gitlab-ci/docker_push.sh b/gitlab-ci/docker_push.sh
index 23806f8cec8766fe0de520ca2a68ac7a3c152c7a..16333af0960f4d67e676711d138dc28629ce65b5 100755
--- a/gitlab-ci/docker_push.sh
+++ b/gitlab-ci/docker_push.sh
@@ -12,6 +12,7 @@ function print_the_help {
   echo "                          (doubled each time), default: 5"
   echo "          -n,--n-attempts Number of attempts, default: 5"
   echo "          -h,--help       Print this message"
+  echo "          --ghcr          Publish to ghcr.io only"
   echo "          --eicweb        Publish to $CI_REGISTRY only"
   echo "          --dockerhub     Publish to DH only"
   echo "  positional              At least one export tag (e.g., v3.0-stable)"
@@ -30,6 +31,7 @@ EXPORT_TAGS=()
 NTRIES=5
 TIME=5
 DO_DH=${DH_PUSH}
+DO_GH=${GH_PUSH}
 DO_EICWEB=1
 
 while [ $# -gt 0 ]; do
@@ -55,13 +57,22 @@ while [ $# -gt 0 ]; do
       shift
       shift
       ;;
+    --ghcr)
+      DO_EICWEB=-
+      DO_DH=0
+      DO_GH=1
+      shift
+      ;;
     --eicweb)
+      DO_EICWEB=1
       DO_DH=0
+      DO_GH=0
       shift
       ;;
     --dockerhub)
       DO_EICWEB=0
       DO_DH=1
+      DO_GH=0
       shift
       ;;
     -h|--help)
@@ -129,14 +140,18 @@ function retry_push () {
 #echo "EXPORT_TAGS: ${EXPORT_TAGS}"
 #echo "DH_PUSH: ${DH_PUSH}"
 #echo "DO_DH: ${DO_DH}"
+#echo "DO_GH: ${DO_GH}"
 #echo "DO_EICWEB: ${DO_EICWEB}"
 
 export INPUT=$CI_REGISTRY_IMAGE/${IMAGE}:${INPUT_TAG}
 for TAG in ${EXPORT_TAGS[@]}; do
   if [ ${DO_EICWEB} != 0 ]; then
-    retry_push $INPUT $CI_REGISTRY_IMAGE/${IMAGE}:${TAG}
+    retry_push $INPUT ${CI_REGISTRY_IMAGE}/${IMAGE}:${TAG}
   fi
   if [ ${DO_DH} != 0 ]; then
-    retry_push $INPUT $DH_REGISTRY/${IMAGE}:${TAG}
+    retry_push $INPUT ${DH_REGISTRY_USER}/${IMAGE}:${TAG}
+  fi
+  if [ ${DO_GH} != 0 ]; then
+    retry_push $INPUT ${GH_REGISTRY}/eic/${IMAGE}:${TAG}
   fi
 done