74 lines
2.2 KiB
Bash
Executable File
74 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# Helper function to safely login to ECR Public with per-job config isolation
|
|
# Uses DOCKER_CONFIG environment variable to prevent race conditions
|
|
#
|
|
# This script prevents the "device or resource busy" error by giving each
|
|
# Buildkite job its own isolated Docker config directory.
|
|
#
|
|
# Usage:
|
|
# source docker_login_ecr_public.sh && safe_docker_login_ecr_public
|
|
|
|
set -euo pipefail
|
|
|
|
# Configuration
|
|
ECR_REGISTRY="public.ecr.aws"
|
|
|
|
setup_isolated_docker_config() {
|
|
# Use BUILDKITE_JOB_ID for job-specific isolation
|
|
# Fallback to PID if running outside Buildkite
|
|
local job_id="${BUILDKITE_JOB_ID:-$$}"
|
|
|
|
# Set Docker config to job-specific directory
|
|
export DOCKER_CONFIG="/tmp/docker-config-${job_id}"
|
|
|
|
# Create directory if it doesn't exist
|
|
mkdir -p "$DOCKER_CONFIG"
|
|
|
|
echo "[docker-config] Using isolated Docker config: $DOCKER_CONFIG"
|
|
}
|
|
|
|
check_docker_auth() {
|
|
# Check if already authenticated to the given registry
|
|
# Returns 0 if authenticated, 1 if not
|
|
local registry="$1"
|
|
|
|
# Check if credentials exist in the isolated config
|
|
if [[ -f "$DOCKER_CONFIG/config.json" ]]; then
|
|
# Check if registry is present in config
|
|
if grep -q "$registry" "$DOCKER_CONFIG/config.json" 2>/dev/null; then
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
safe_docker_login_ecr_public() {
|
|
# Setup isolated config first
|
|
setup_isolated_docker_config
|
|
|
|
local registry="$ECR_REGISTRY"
|
|
|
|
# Check if already authenticated (within this job)
|
|
if check_docker_auth "$registry"; then
|
|
echo "[docker-login] Already authenticated to $registry in this job"
|
|
return 0
|
|
fi
|
|
|
|
# Perform login to isolated config directory
|
|
echo "[docker-login] Logging in to $ECR_REGISTRY (isolated config)..."
|
|
if aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin "$ECR_REGISTRY"; then
|
|
echo "[docker-login] Login successful (config: $DOCKER_CONFIG)"
|
|
return 0
|
|
else
|
|
local exit_code=$?
|
|
echo "[docker-login] ERROR: Login failed with exit code $exit_code" >&2
|
|
return $exit_code
|
|
fi
|
|
}
|
|
|
|
# Execute if run as script (not sourced)
|
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
safe_docker_login_ecr_public
|
|
fi
|