|
| 1 | +// CHANGE: add automatic DNS repair at container startup |
| 2 | +// WHY: Docker internal DNS (127.0.0.11) intermittently loses external nameservers, |
| 3 | +// causing domain resolution to fail inside containers |
| 4 | +// QUOTE(ТЗ): "При запуске контейнера он всегда исправляет интернет соединение потому что оно время от времени ложится" |
| 5 | +// REF: issue-168 |
| 6 | +// SOURCE: n/a |
| 7 | +// FORMAT THEOREM: ∀container: startup(container) → dns_healthy(container) ∨ dns_repaired(container) |
| 8 | +// PURITY: SHELL |
| 9 | +// EFFECT: Effect<void, DnsRepairError, Env> |
| 10 | +// INVARIANT: after execution, at least one nameserver in /etc/resolv.conf resolves external domains |
| 11 | +// COMPLEXITY: O(1) per probe attempt, O(max_attempts) worst case |
| 12 | +export const renderEntrypointDnsRepair = (): string => |
| 13 | + `# 0) Ensure DNS resolution works; repair /etc/resolv.conf if Docker DNS is broken |
| 14 | +docker_git_repair_dns() { |
| 15 | + local test_domain="github.com" |
| 16 | + local resolv="/etc/resolv.conf" |
| 17 | + local fallback_dns="8.8.8.8 8.8.4.4 1.1.1.1" |
| 18 | +
|
| 19 | + if getent hosts "$test_domain" >/dev/null 2>&1; then |
| 20 | + return 0 |
| 21 | + fi |
| 22 | +
|
| 23 | + echo "[dns-repair] DNS resolution failed for $test_domain; attempting repair..." |
| 24 | +
|
| 25 | + # Preserve Docker internal resolver but append external fallbacks |
| 26 | + local has_external=0 |
| 27 | + for ns in $fallback_dns; do |
| 28 | + if grep -q "nameserver $ns" "$resolv" 2>/dev/null; then |
| 29 | + has_external=1 |
| 30 | + fi |
| 31 | + done |
| 32 | +
|
| 33 | + if [[ "$has_external" -eq 0 ]]; then |
| 34 | + for ns in $fallback_dns; do |
| 35 | + printf "nameserver %s\\n" "$ns" >> "$resolv" |
| 36 | + done |
| 37 | + echo "[dns-repair] appended fallback nameservers to $resolv" |
| 38 | + fi |
| 39 | +
|
| 40 | + # Verify fix |
| 41 | + if getent hosts "$test_domain" >/dev/null 2>&1; then |
| 42 | + echo "[dns-repair] DNS resolution restored" |
| 43 | + return 0 |
| 44 | + fi |
| 45 | +
|
| 46 | + echo "[dns-repair] WARNING: DNS resolution still failing after repair attempt" |
| 47 | + return 1 |
| 48 | +} |
| 49 | +docker_git_repair_dns || true` |
0 commit comments