کیاسدن آیْنالْ‌ها (Mirrors) در داکر: رهایی از بن‌بست نصب بسته در قطعی اینترنت

کیاسدن (هندل کردن) نصب بسته‌ها
کیاسدن (هندل کردن) نصب بسته‌ها

در این مقاله، راه حل عملی کیاسدَن [هندل کردن] (با تمرکز بر ARG در داکر) نصب بسته‌های پایتون و دبیان را ارائه می‌دهم؛ تا بدون نیاز به جراحی دوباره‌ی Dockerfile، بتوانید در لحظه، آیْنال (میرور) مناسب را جایگزین کنید. این روش مخصوصاً برای تیم‌هایی که با محدودیت‌های اینترنت بین‌المللی یا تحریم‌های ناگهانی مواجه می‌شوند، یک ناجی واقعی است.

نکات کلیدی که در این روش برطرف کردم (و در این مقاله مفصل توضیح داده‌ام):

  1. کیاستن داینامیک APT: استخراج خودکار CODENAME سیستم عامل (مثل bookworm) و ساخت فایل sources.list بر اساس آینال‌ای که با `--build-arg` به داکر می‌دهید. دیگر نیاز به Hard-Code کردن توزیع در فایل نیست.

  2. رفع خطای "Release file expired": با وجود اینترنت ضعیف یا آینال‌های قدیمی، داکر از نصب بسته سر باز می‌زند. با اضافه کردن دو خط دیوانه‌وارِ Acquire::Check-Valid-Until "false" این مشکل را مدیریت کردم. (البته با ذکر کاملwarning‌های امنیتی؛ چون فرض می‌کنم شما هم مثل من در شرایط بحران، ظرافت‌های امنیتی را قربانی سرعت می‌کنید).

  3. کیاستن PyPI حتی با HTTPهای عجیب: استخراج خودکار trusted-host از آدرس آیْنال، بدون نیاز به تنظیم دستی. فقط کافیست آدرس آینال را عوض کنید، بقیه‌اش خودکار کیاسده می‌شود (هندل می‌شود).

نتیجه: یک Dockerfile که هم در آمریکا کار می‌کند، هم در اروپا، هم در ایران (با آینال‌هایی که توی کامنت‌ها گذاشتم: آروان، ای‌یوتی، ران‌فلیر و...). با این ترفند، دیگر نگران «کجا دیپلوی می‌کنم؟» یا «اینترنت چنده؟» نیستید.

مقاله رو به صورت گام به گام و با دقت برای متخصصانی مثل خودتون نوشتم. اگر از دستور tee برای بازنویسی sources.list یا سِد (sed) برای استخراج هاست ایراد می‌گیرید، خوشحال می‌شم توی کامنت‌ها بحث کنیم. ;)
> واژه «آیْنال» از مصدر «آیِنْدَن» (بازتاب/آینه یافتن) ساخته شده، و به‌معنی «وسیله آینه‌سازی/بازتاب‌دهی» می‌باشد.

```Dockerfile
# Python version with base image (slim-bookworm for smaller footprint)
ARG PYTHON_TAG=3.14-slim-bookworm

# PyPI mirror URL (overrideable for faster regional downloads)
# ----------------------
# Common mirrors:
# - China: https://mirrors.aliyun.com/pypi/simple/
# - USA: https://pypi.org/simple/
# - Europe: https://mirrors.bfsu.edu.cn/pypi/web/simple/
# - Iran: https://package-mirror.liara.ir/repository/pypi/simple
# - Iran: http://mirrors.aliyun.com/pypi/simple/
# - Iran: https://mirror-pypi.runflare.com/simple
ARG PYPI_MIRROR=https://pypi.org/simple/

# Debian apt mirror (overrideable for faster regional downloads)
# ----------------------
# Common mirrors:
# - Default: http://deb.debian.org/debian
# - China: http://mirrors.tuna.tsinghua.edu.cn/debian
# - USA: http://ftp.us.debian.org/debian
# - Iran: http://mirror.iranserver.com/debian
# - Iran: http://mirror.arvancloud.ir/debian
# - Iran: http://mirror-linux.runflare.com/debian
# - Iran: http://repo.iut.ac.ir/debian
ARG APT_MIRROR=http://deb.debian.org/debian

# Working directory inside the container
ARG WORK_DIRECTORY=/app

# =============================================================================
# STAGE 1: BASE PYTHON IMAGE
# =============================================================================
FROM python:${PYTHON_TAG} AS python-base

# -----------------------------------------------------------------------------
# Build Arguments
# -----------------------------------------------------------------------------
ARG APT_MIRROR
ARG PYPI_MIRROR

# -----------------------------------------------------------------------------
# Configure APT Mirror for Faster Package Downloads
# -----------------------------------------------------------------------------
# Description: Dynamically configures apt mirrors based on the distribution
# codename to improve package download speeds.
# -----------------------------------------------------------------------------
RUN CODENAME=$(grep VERSION_CODENAME /etc/os-release | cut -d= -f2) \
&& tee /etc/apt/sources.list > /dev/null <<EOF
deb ${APT_MIRROR} ${CODENAME} main contrib non-free non-free-firmware
deb ${APT_MIRROR} ${CODENAME}-updates main contrib non-free non-free-firmware
deb ${APT_MIRROR} ${CODENAME}-backports main contrib non-free non-free-firmware
deb ${APT_MIRROR}-security ${CODENAME}-security main contrib non-free non-free-firmware
EOF

# -----------------------------------------------------------------------------
# Disable APT Repository Validity Checks (⚠️ SECURITY WARNING)
# -----------------------------------------------------------------------------
# Description: Disables apt's repository expiration and security validation.
# This is a WORKAROUND for mirrors with outdated Release files,
# particularly relevant in environments with national network
# restrictions.
#
# Use Case: ONLY when no reliable/updated mirror is accessible due to
# network restrictions. This is a TEMPORARY workaround.
# -----------------------------------------------------------------------------
RUN echo 'Acquire::Check-Valid-Until "false";' > /etc/apt/apt.conf.d/99-no-check-valid-until \
&& echo 'Acquire::AllowInsecureRepositories "true";' >> /etc/apt/apt.conf.d/99-no-check-valid-until

# -----------------------------------------------------------------------------
# Configure PyPI Mirror for Faster Python Package Downloads
# -----------------------------------------------------------------------------
# Description: Sets up pip to use a custom PyPI mirror for faster package
# downloads and configures trusted hosts to avoid SSL warnings.
# -----------------------------------------------------------------------------
RUN pip config --user set global.index ${PYPI_MIRROR} \
&& pip config --user set global.index-url ${PYPI_MIRROR} \
&& pip config --user set global.trusted-host $(echo ${PYPI_MIRROR} | sed -E 's|^https?://([^/:]+).*$|\1|') \
&& pip config --user set global.timeout 60
```

خوشحال می‌شم نظرتون رو بدونم.