Docker وC++: حاويات التطبيقات المتقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

Docker وC++: حاويات التطبيقات: مستوى متقدم

\n\n

حاويات تطبيقات C++ باستخدام Docker ليست مجرد نقل ملف ثنائي إلى بيئة معزولة. على المستوى المتقدم، يجب مراعاة خصائص التجميع، إدارة التبعيات، تحسين حجم الصورة والتصحيح. في هذه المقالة، سنستعرض أفضل الممارسات لإنشاء صور Docker فعالة لمشاريع C++، باستخدام البناء متعدد المراحل، الربط الثابت والديناميكي، بالإضافة إلى الأدوات الحديثة مثل CMake وvcpkg.

\n\n

1. البناء متعدد المراحل (Multi-stage build)

\n

المشكلة الكلاسيكية لصور Docker الخاصة بـ C++ هي الحجم الضخم بسبب تضمين المترجم، ملفات الرأس والمكتبات في الصورة النهائية. يحل البناء متعدد المراحل هذه المشكلة: المرحلة الأولى (مرحلة البناء) تحتوي على جميع أدوات التجميع، بينما المرحلة الثانية (مرحلة التشغيل) تحتوي فقط على الحد الأدنى من تبعيات وقت التشغيل.

\n\n
# المرحلة الأولى: البناء\nFROM gcc:13 AS builder\nWORKDIR /app\nCOPY . .\nRUN apt-get update && apt-get install -y cmake libboost-all-dev && \\\n    cmake -B build -DCMAKE_BUILD_TYPE=Release && \\\n    cmake --build build --parallel $(nproc)\n\n# المرحلة الثانية: وقت التشغيل\nFROM alpine:3.19\nRUN apk add --no-cache libstdc++ libgcc\nCOPY --from=builder /app/build/my_app /usr/local/bin/my_app\nCMD ["my_app"]
\n\n

هذا الأسلوب يقلل الصورة النهائية من 1.5 جيجابايت (صورة مع GCC) إلى حوالي 30 ميجابايت. لتشغيل تطبيق C++ في Alpine، يكفي فقط libstdc++ وlibgcc.

\n\n

2. إدارة التبعيات: vcpkg وConan

\n

لمشاريع C++ الحديثة التي تحتوي على عشرات المكتبات، يصبح التثبيت اليدوي للتبعيات عبر apt-get غير قابل للإدارة. الحل الأفضل هو استخدام مديري الحزم مثل vcpkg أو Conan مباشرة في Dockerfile.

\n\n
FROM ubuntu:22.04 AS builder\nRUN apt-get update && apt-get install -y curl git cmake build-essential\nRUN git clone https://github.com/Microsoft/vcpkg.git /opt/vcpkg && \\\n    /opt/vcpkg/bootstrap-vcpkg.sh && \\\n    /opt/vcpkg/vcpkg install fmt spdlog nlohmann-json\n\nWORKDIR /app\nCOPY . .\nRUN cmake -B build -DCMAKE_TOOLCHAIN_FILE=/opt/vcpkg/scripts/buildsystems/vcpkg.cmake && \\\n    cmake --build build
\n\n

هام: لتجنب إعادة بناء vcpkg والمكتبات في كل مرة يتم فيها تغيير الكود المصدري، قم بنسخ vcpkg.json وCMakeLists.txt قبل نسخ الملفات الأخرى. يقوم Docker بتخزين الطبقات مؤقتًا، ولن يتم إعادة تثبيت التبعيات إلا عند تغيير الملف البياني.

\n\n

3. تحسين الصورة: الربط الثابت وAlpine

\n

لتقليل حجم الصورة إلى أقصى حد، يمكن استخدام الربط الثابت. هذا مهم بشكل خاص للخدمات المصغرة وأدوات سطر الأوامر. ومع ذلك، تذكر: الربط الثابت قد يزيد حجم الملف الثنائي، لكنه يلغي الحاجة إلى إحضار المكتبات الديناميكية إلى الحاوية.

\n\n
# CMakeLists.txt\nset(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")\ntarget_link_libraries(my_app PRIVATE fmt::fmt spdlog::spdlog)
\n\n

يمكن بناء الصورة النهائية على scratch (صورة فارغة):

\n\n
FROM scratch\nCOPY --from=builder /app/build/my_app /\nENTRYPOINT ["/my_app"]
\n\n

تزن هذه الصورة بضعة ميغابايت فقط. ومع ذلك، ضع في اعتبارك: الربط الثابت ليس ممكنًا دائمًا (على سبيل المثال، عند استخدام OpenSSL أو CUDA)، وفي هذه الحالات من الأفضل استخدام Alpine مع المكتبات الديناميكية.

\n\n

4. تصحيح تطبيقات C++ في الحاوية

\n

التصحيح في Docker هو تحدٍ منفصل. تشمل الأساليب المتقدمة:

\n
    \n
  • استخدام صور التصحيح: قم ببناء صورة منفصلة تحتوي على رموز التصحيح وgdbserver. اتصل بها من بيئة التطوير المتكاملة (VS Code, CLion) عبر التصحيح عن بُعد.
  • \n
  • ملفات التفريغ الأساسية (Core dumps): اسمح بكتابة ملفات التفريغ الأساسية في الحاوية وقم بتحليلها بعد الانهيار:
  • \n
\n\n
# Dockerfile لـ                

المدونات

توصيات الكتب