Avoid race condition when fetching containers during build (#1671)

* Avoid race condition when fetching containers during build

So far only a single builder was active for each architecture. This
toghether with the naming scheme to include architecture/machine name
made sure that an image could only be fetched or used by a single
builder.

However, since most systems are now aarch64, multiple runners are now
active for a single architecture. This makes it necessary to lock
fetching/coping of container images to avoid race conditions.
This commit is contained in:
Stefan Agner 2021-12-13 16:43:42 +01:00 committed by GitHub
parent c99927f3c4
commit 19a135edac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -24,15 +24,16 @@ image_file_name="${full_image_name//[:\/]/_}@${image_digest//[:\/]/_}"
image_file_path="${dl_dir}/${image_file_name}.tar" image_file_path="${dl_dir}/${image_file_name}.tar"
dst_image_file_path="${dst_dir}/${image_file_name}.tar" dst_image_file_path="${dst_dir}/${image_file_name}.tar"
if [ -f "${image_file_path}" ] (
then # Use file locking to avoid race condition
flock --verbose 3
if [ ! -f "${image_file_path}" ]
then
echo "Fetching image: ${full_image_name} (digest ${image_digest})"
skopeo copy "docker://${image_name}@${image_digest}" "docker-archive:${image_file_path}:${full_image_name}"
else
echo "Skipping download of existing image: ${full_image_name} (digest ${image_digest})" echo "Skipping download of existing image: ${full_image_name} (digest ${image_digest})"
fi
cp "${image_file_path}" "${dst_image_file_path}" cp "${image_file_path}" "${dst_image_file_path}"
exit 0 ) 3>"${image_file_path}.lock"
fi
# Use digest here to avoid race conditions of any sort...
echo "Fetching image: ${full_image_name}"
skopeo copy "docker://${image_name}@${image_digest}" "docker-archive:${image_file_path}:${full_image_name}"
cp "${image_file_path}" "${dst_image_file_path}"