fix(ci): lock Poetry to version 2.2.1 for Python 3.9 compatibility

Poetry 2.3.x requires Python >= 3.10, but this project uses Python 3.9.
Lock Poetry to version 2.2.1 (last version compatible with Python 3.9).

Also add PR trigger for Docker builds and fix Docker tag slash issues
by replacing slashes with dashes in ref_name.
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 34e9f28..c3361ea 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -27,6 +27,11 @@
       - main
       - release-*
       - fix-clear-docker-images-before-build
+  pull_request:
+    paths:
+      - 'backend/Dockerfile'
+      - 'config-ui/Dockerfile'
+      - 'grafana/Dockerfile'
 
 jobs:
   build-and-push-builder:
@@ -186,12 +191,13 @@
         id: get_push_tags
         run: |
           image_name=${{ secrets.DOCKERHUB_OWNER }}/devlake
+          ref_name=$(echo "${{ github.ref_name }}" | tr '/' '-')
           if printf ${{ github.ref }} |grep -Pq '^refs/tags/' && printf ${{ github.ref_name }} | grep -Pq '^v(\d+).(\d+).(\d+)$'; then
               echo "TAGS=${image_name}:latest,${image_name}:${{ github.ref_name }}" >> $GITHUB_OUTPUT
           elif printf ${{ github.ref }} |grep -Pq '^refs/tags/'; then
               echo "TAGS=${image_name}:${{ github.ref_name }}" >> $GITHUB_OUTPUT
           else
-              echo "TAGS=${image_name}:${{ github.ref_name }}_${{ needs.get-timestamp.outputs.timestamp }}_${{ steps.get_short_sha.outputs.SHORT_SHA }}" >> $GITHUB_OUTPUT
+              echo "TAGS=${image_name}:${ref_name}_${{ needs.get-timestamp.outputs.timestamp }}_${{ steps.get_short_sha.outputs.SHORT_SHA }}" >> $GITHUB_OUTPUT
           fi
       - name: Build and push lake image
         uses: docker/build-push-action@v3
@@ -265,12 +271,13 @@
         id: get_push_tags
         run: |
           image_name=${{ secrets.DOCKERHUB_OWNER }}/${{ matrix.build.image }}
+          ref_name=$(echo "${{ github.ref_name }}" | tr '/' '-')
           if printf ${{ github.ref }} |grep -Pq '^refs/tags/' && printf ${{ github.ref_name }} | grep -Pq '^v(\d+).(\d+).(\d+)$'; then
               echo "TAGS=${image_name}:latest,${image_name}:${{ github.ref_name }}" >> $GITHUB_OUTPUT
           elif printf ${{ github.ref }} |grep -Pq '^refs/tags/'; then
               echo "TAGS=${image_name}:${{ github.ref_name }}" >> $GITHUB_OUTPUT
           else
-              echo "TAGS=${image_name}:${{ github.ref_name }}_${{ needs.get-timestamp.outputs.timestamp }}_${{ steps.get_short_sha.outputs.SHORT_SHA }}" >> $GITHUB_OUTPUT
+              echo "TAGS=${image_name}:${ref_name}_${{ needs.get-timestamp.outputs.timestamp }}_${{ steps.get_short_sha.outputs.SHORT_SHA }}" >> $GITHUB_OUTPUT
           fi
       - name: Build and push ${{ matrix.build.name }} image
         uses: docker/build-push-action@v3
diff --git a/backend/Dockerfile b/backend/Dockerfile
index 69cbeca..5b03c30 100644
--- a/backend/Dockerfile
+++ b/backend/Dockerfile
@@ -149,7 +149,8 @@
     python3 -m pip install --upgrade pip
 
 # Setup Python Poetry package manager
-RUN curl -sSL https://install.python-poetry.org | python3 -
+# Install Poetry 2.2.1 (last version compatible with Python 3.9)
+RUN curl -sSL https://install.python-poetry.org | python3 - --version 2.2.1
 ENV PATH="$PATH:/app/.local/bin"
 
 # Build Python plugins, make sure the scripts has execute permission