diff --git a/InvenTree/InvenTree/api_version.py b/InvenTree/InvenTree/api_version.py
index 86f41816b2..e391a00bd1 100644
--- a/InvenTree/InvenTree/api_version.py
+++ b/InvenTree/InvenTree/api_version.py
@@ -4,11 +4,15 @@ InvenTree API version information
 
 
 # InvenTree API version
-INVENTREE_API_VERSION = 46
+INVENTREE_API_VERSION = 47
 
 """
 Increment this API version number whenever there is a significant change to the API that any clients need to know about
 
+v47 -> 2022-05-10 : https://github.com/inventree/InvenTree/pull/2964
+    - Fixes barcode API error response when scanning a StockItem which does not exist
+    - Fixes barcode API error response when scanning a StockLocation which does not exist
+
 v46 -> 2022-05-09
     - Fixes read permissions on settings API
     - Allows non-staff users to read global settings via the API
diff --git a/InvenTree/barcodes/plugins/inventree_barcode.py b/InvenTree/barcodes/plugins/inventree_barcode.py
index 5df71cb776..604936c216 100644
--- a/InvenTree/barcodes/plugins/inventree_barcode.py
+++ b/InvenTree/barcodes/plugins/inventree_barcode.py
@@ -83,7 +83,7 @@ class InvenTreeBarcodePlugin(BarcodePlugin):
                     item = StockItem.objects.get(pk=pk)
                     return item
                 except (ValueError, StockItem.DoesNotExist):  # pragma: no cover
-                    raise ValidationError({k, "Stock item does not exist"})
+                    raise ValidationError({k: "Stock item does not exist"})
 
         return None
 
@@ -111,7 +111,7 @@ class InvenTreeBarcodePlugin(BarcodePlugin):
                     loc = StockLocation.objects.get(pk=pk)
                     return loc
                 except (ValueError, StockLocation.DoesNotExist):  # pragma: no cover
-                    raise ValidationError({k, "Stock location does not exist"})
+                    raise ValidationError({k: "Stock location does not exist"})
 
         return None
 
@@ -132,12 +132,12 @@ class InvenTreeBarcodePlugin(BarcodePlugin):
                     try:
                         pk = self.data[k]['id']
                     except (AttributeError, KeyError):
-                        raise ValidationError({k, 'id parameter not supplied'})
+                        raise ValidationError({k: 'id parameter not supplied'})
 
                 try:
                     part = Part.objects.get(pk=pk)
                     return part
                 except (ValueError, Part.DoesNotExist):  # pragma: no cover
-                    raise ValidationError({k, 'Part does not exist'})
+                    raise ValidationError({k: 'Part does not exist'})
 
         return None
diff --git a/InvenTree/barcodes/tests.py b/InvenTree/barcodes/tests.py
index 18d4e77d20..b092e7eb32 100644
--- a/InvenTree/barcodes/tests.py
+++ b/InvenTree/barcodes/tests.py
@@ -86,6 +86,22 @@ class BarcodeAPITest(APITestCase):
         self.assertIn('barcode_data', response.data)
         self.assertEqual(response.data['part']['pk'], 1)
 
+    def test_invalid_part(self):
+        """Test response for invalid part"""
+        response = self.client.post(
+            self.scan_url,
+            {
+                'barcode': {
+                    'part': 999999999,
+                }
+            },
+            format='json'
+        )
+
+        self.assertEqual(response.status_code, 400)
+
+        self.assertEqual(response.data['part'], 'Part does not exist')
+
     def test_find_stock_item(self):
         """
         Test that we can lookup a stock item based on ID
@@ -106,6 +122,23 @@ class BarcodeAPITest(APITestCase):
         self.assertIn('barcode_data', response.data)
         self.assertEqual(response.data['stockitem']['pk'], 1)
 
+    def test_invalid_item(self):
+        """Test response for invalid stock item"""
+
+        response = self.client.post(
+            self.scan_url,
+            {
+                'barcode': {
+                    'stockitem': 999999999,
+                }
+            },
+            format='json'
+        )
+
+        self.assertEqual(response.status_code, 400)
+
+        self.assertEqual(response.data['stockitem'], 'Stock item does not exist')
+
     def test_find_location(self):
         """
         Test that we can lookup a stock location based on ID
@@ -126,6 +159,23 @@ class BarcodeAPITest(APITestCase):
         self.assertIn('barcode_data', response.data)
         self.assertEqual(response.data['stocklocation']['pk'], 1)
 
+    def test_invalid_location(self):
+        """Test response for an invalid location"""
+
+        response = self.client.post(
+            self.scan_url,
+            {
+                'barcode': {
+                    'stocklocation': 999999999,
+                }
+            },
+            format='json'
+        )
+
+        self.assertEqual(response.status_code, 400)
+
+        self.assertEqual(response.data['stocklocation'], 'Stock location does not exist')
+
     def test_integer_barcode(self):
 
         response = self.postBarcode(self.scan_url, '123456789')
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 63535bd83d..cefd2c2b61 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -95,6 +95,9 @@ RUN echo "Downloading InvenTree from ${INVENTREE_GIT_REPO}"
 
 RUN git clone --branch ${INVENTREE_GIT_BRANCH} --depth 1 ${INVENTREE_GIT_REPO} ${INVENTREE_HOME}
 
+# Ref: https://github.blog/2022-04-12-git-security-vulnerability-announced/
+RUN git config --global --add safe.directory ${INVENTREE_HOME}
+
 # Checkout against a particular git tag
 RUN if [ -n "${INVENTREE_GIT_TAG}" ] ; then cd ${INVENTREE_HOME} && git fetch --all --tags && git checkout tags/${INVENTREE_GIT_TAG} -b v${INVENTREE_GIT_TAG}-branch ; fi