Kasus penggunaan umum untuk pipeline CI adalah membuat image Docker yang akan Anda gunakan untuk men-deploy aplikasi Anda. GitLab CI adalah pilihan yang baik untuk ini karena mendukung layanan proxy tarik terintegrasi, yang berarti saluran pipa yang lebih cepat, dan registri bawaan untuk menyimpan gambar yang Anda buat.
Dalam panduan ini, kami akan menunjukkan cara menyiapkan build Docker yang menggunakan kedua fitur di atas. Langkah-langkah yang perlu Anda ambil sedikit berbeda tergantung pada jenis pelaksana GitLab Runner yang akan Anda gunakan untuk pipeline Anda. Kami akan membahas implementasi Shell dan Docker di bawah ini.
Membangun Dengan Pelaksana Shell
Jika Anda menggunakan eksekutor Shell, pastikan Anda telah menginstal Docker di mesin yang menghosting runner Anda. Pelaksana bekerja dengan menjalankan perintah shell biasa menggunakan docker biner pada host Runner.
Buka repositori Git untuk proyek tempat Anda ingin membuat gambar. Menghasilkan .gitlab-ci.yml file di root repositori. File ini mendefinisikan pipeline GitLab CI yang akan berjalan saat Anda mendorong perubahan ke proyek Anda.
Tambahkan konten berikut ke file:
stages: - build docker_build: stage: build script: - docker build -t example.com/example-image:latest . - docker push example.com/example-image:latest
Konfigurasi sederhana ini cukup untuk mendemonstrasikan dasar-dasar pembangunan citra bertenaga pipa. GitLab secara otomatis mengkloning repositori Git Anda ke lingkungan build untuk dijalankan docker build akan menggunakan proyek Anda Dockerfile dan membuat konten repositori tersedia sebagai konteks build.
Setelah build selesai, Anda dapat docker push foto di registri Anda. Jika tidak, itu hanya tersedia di instalasi Docker lokal yang menjalankan build. Jika Anda menggunakan registri pribadi, jalankan docker login pertama berikan detail autentikasi yang valid:
script: - docker login -u $DOCKER_REGISTRY_USER -p $DOCKER_REGISTRY_PASSWORD
Tentukan nilai dari dua variabel kredensial dengan masuk ke Pengaturan > CI/CD > Variabel di UI web GitLab. Klik tombol biru “Tambah variabel” untuk membuat variabel baru dan menetapkan nilai. GitLab akan membuat variabel-variabel ini tersedia untuk lingkungan shell yang digunakan untuk menjalankan pekerjaan Anda.

Membangun Dengan Pelaksana Docker
Pelaksana Docker GitLab Runner biasanya digunakan untuk menyediakan lingkungan yang sepenuhnya bersih untuk setiap pekerjaan. Pekerjaan akan dilakukan dalam wadah yang terisolasi sehingga: docker Biner pada host Runner tidak dapat diakses.
Eksekutor Docker memberi Anda dua kemungkinan pendekatan untuk membangun image Anda: gunakan Docker-in-Docker, atau ikat soket Docker host ke lingkungan build Runner. Kemudian Anda menggunakan gambar wadah Docker resmi sebagai gambar kerja Anda, lakukan docker perintah yang tersedia di skrip CI Anda.
Docker-in-Docker
Menggunakan Docker-in-Docker (DinD) untuk membangun gambar Anda memberi Anda lingkungan yang sepenuhnya terisolasi untuk setiap pekerjaan. Proses Docker yang menjalankan build akan menjadi anak dari container yang dibuat oleh GitLab Runner di host untuk menjalankan tugas CI.
Anda perlu mendaftarkan pelaksana GitLab Runner Docker Anda dengan mode istimewa yang diaktifkan untuk menggunakan DinD. Tambahkan --docker-privileged tandai saat Anda mendaftarkan pelari Anda:
sudo gitlab-runner register -n --url --registration-token $GITLAB_REGISTRATION_TOKEN --executor docker --description "Docker Runner" --docker-image "docker:20.10" --docker-volumes "/certs/client" --docker-privileged
Di dalam pipa CI Anda, tambahkan docker:dind gambar sebagai layanan. Ini membuat Docker tersedia sebagai gambar terpisah yang ditautkan ke gambar pekerjaan. Anda dapat menggunakan docker perintah untuk membuat gambar dengan instance Docker di docker:dind wadah
services: - docker:dind docker_build: stage: build image: docker:latest script: - docker build -t example-image:latest .
Menggunakan DinD memberi Anda bangunan yang sepenuhnya terisolasi yang tidak akan memengaruhi satu sama lain atau host Anda. Kelemahan utama adalah perilaku caching yang lebih rumit: setiap pekerjaan mendapatkan lingkungan baru di mana lapisan yang dibuat sebelumnya tidak dapat diakses. Anda dapat mengatasi sebagian masalah ini dengan mencoba menarik versi gambar sebelumnya sebelum Anda membuat, lalu gunakan --cache-from menghasilkan bendera untuk membuat lapisan gambar yang diambil tersedia sebagai sumber cache:
docker_build: stage: build image: docker:latest script: - docker pull $CI_REGISTRY_IMAGE:latest || true - docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE:latest .
Soket Bind Mount
Memasang soket Docker host Anda di lingkungan kerja Anda adalah opsi alternatif saat Anda menggunakan eksekutor Docker. Ini memberi Anda caching terus menerus dan menghilangkan kebutuhan untuk menambahkan docker:dind layanan di konfigurasi CI Anda.
Untuk mengaturnya, daftarkan Pelari Anda dengan a docker-volumes bendera yang mengikat ke soket Docker host /var/run/docker.sock di dalam wadah kerja:
sudo gitlab-runner register -n --url --registration-token $GITLAB_REGISTRATION_TOKEN --executor docker --description "Docker Runner" --docker-image "docker:20.10" --docker-volumes /var/run/docker.sock:/var/run/docker.sock
Sekarang pekerjaan sedang berjalan docker Gambar dapat menggunakan docker biner seperti biasa. Operasi sebenarnya akan berlangsung di mesin host Anda, yang akan menjadi saudara dari wadah kerja, bukan anak-anak.
Ini secara efektif sama dengan menggunakan eksekutor Shell pada instalasi Docker Host Anda. Gambar akan tetap ada di host, memfasilitasi penggunaan reguler yang berkelanjutan docker build cache lapisan.
Meskipun pendekatan ini dapat menghasilkan kinerja yang lebih tinggi, konfigurasi yang lebih sedikit, dan tidak ada batasan DinD, pendekatan ini memiliki masalah uniknya sendiri. Yang paling menonjol dari ini adalah implikasi keamanan: pekerjaan dapat mengeksekusi perintah Docker sewenang-wenang pada host Runner Anda, sehingga proyek jahat dapat berjalan pada instans GitLab Anda. docker run -it malicious-image:latest Hai docker rm -f $(docker ps -a) dengan konsekuensi yang menghancurkan.
GitLab juga memperingatkan bahwa pengikatan soket dapat menyebabkan masalah saat pekerjaan berjalan secara bersamaan. Ini terjadi ketika Anda mengandalkan wadah yang dibuat dengan nama tertentu. Jika dua contoh pekerjaan berjalan secara paralel, yang kedua akan gagal karena nama penampung sudah ada di host Anda.
Anda harus mempertimbangkan untuk menggunakan DinD sebagai gantinya jika Anda mengharapkan salah satu dari masalah ini menjadi sulit. Meskipun DinD tidak lagi direkomendasikan secara umum, mungkin lebih masuk akal untuk instans GitLab yang menghadap publik yang menjalankan tugas CI secara bersamaan.
Mendorong Gambar ke Registri GitLab
Proyek GitLab memiliki opsi registri terintegrasi yang dapat Anda gunakan untuk menyimpan gambar Anda. Anda dapat melihat konten registri dengan menavigasi ke Packages & Registry > Container Registry di sidebar proyek Anda. Jika Anda tidak melihat tautan ini, aktifkan registri dengan masuk ke Pengaturan > Umum > Visibilitas, Proyek, Fitur & Izin dan aktifkan sakelar “Penampung registri”.

GitLab secara otomatis menetapkan variabel lingkungan dalam pekerjaan CI Anda yang memungkinkan Anda untuk mereferensikan registri kontainer proyek Anda. Perbaiki script bagian untuk masuk ke registri dan mendorong foto Anda:
script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:latest
GitLab menghasilkan satu set kredensial yang aman untuk setiap pekerjaan CI Anda. Itu $CI_JOB_TOKEN variabel lingkungan akan berisi token akses yang dapat digunakan pekerjaan untuk terhubung ke registri sebagai gitlab-ci-token pengguna. URL server registri tersedia sebagai $CI_REGISTRY.
variabel terakhir, $CI_REGISTRY_IMAGE, memberikan jalur lengkap ke registri penampung proyek Anda. Ini adalah dasar yang cocok untuk tag foto Anda. Anda dapat memperluas variabel ini untuk membuat sub-repositori, seperti $CI_REGISTRY_IMAGE/production/api:latest.
Klien Docker lain dapat mengambil gambar dari registri dengan mengautentikasi dengan token akses. Anda dapat membuatnya di layar Pengaturan > Akses Token proyek Anda. Tambahkan read_registry lingkup, lalu gunakan kredensial yang ditampilkan untuk docker login di registri proyek Anda.
Menggunakan Proksi Ketergantungan GitLab
Dependency Proxy GitLab menyediakan lapisan caching untuk gambar upstream yang Anda tarik dari Docker Hub. Ini membantu Anda tetap berada dalam batas kecepatan Docker Hub dengan hanya menarik konten gambar saat benar-benar berubah. Ini juga akan meningkatkan kinerja bangunan Anda.

Dependency Proxy diaktifkan di tingkat tim GitLab dengan masuk ke Settings > Packages and Registry > Dependency Proxy. Setelah diaktifkan, awali referensi gambar dengan Anda .gitlab-ci.yml mengajukan dengan $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX untuk menarik mereka ke proxy:
docker_build: stage: build image: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/docker:latest services: - name: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/docker:dind alias: docker
Hanya itu yang ada! GitLab Runner secara otomatis masuk ke registri proxy dependensi sehingga tidak perlu memberikan kredensial Anda secara manual.
GitLab sekarang akan men-cache gambar Anda, memberi Anda peningkatan kinerja serta ketahanan terhadap pemadaman jaringan. Ingat bahwa services definisi juga perlu diperbaiki – variabel lingkungan tidak berfungsi dalam bentuk sebaris yang digunakan sebelumnya, jadi seluruh gambar name harus ditentukan, maka perintah alias untuk merujuk ke Anda script bagian.
Meskipun kami sekarang telah menyiapkan proxy untuk gambar yang digunakan secara langsung oleh tahapan pekerjaan kami, lebih banyak pekerjaan diperlukan untuk menambahkan dukungan untuk gambar dasar di Dockerfile untuk membangun Instruksi reguler seperti ini tidak melalui proxy:
FROM ubuntu:latest
Untuk menambahkan bagian terakhir ini, gunakan argumen build Docker untuk membuat URL proxy dependensi tersedia saat melewati Dockerfile:
ARG GITLAB_DEPENDENCY_PROXY
FROM ${GITLAB_DEPENDENCY_PROXY}/ubuntu:latest
Kemudian ubah docker build perintah untuk menentukan nilai variabel:
script: > - docker build --build-arg GITLAB_DEPENDENCY_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX} -t example-image:latest .
Sekarang gambar dasar Anda juga akan diambil melalui proxy ketergantungan.
Ringkasan
Build image Docker mudah diintegrasikan ke dalam pipeline GitLab CI Anda. Setelah konfigurasi awal Runner, docker build dan docker push pesanan dalam pekerjaan Anda script bagian adalah semua yang Anda butuhkan untuk membuat gambar dengan Dockerfile dalam penyimpanan Anda. Registri kontainer bawaan GitLab memberi Anda penyimpanan pribadi untuk gambar proyek Anda.

Di luar build dasar, ada baiknya menyertakan proksi ketergantungan GitLab untuk mempercepat kinerja dan menghindari batas kecepatan Docker Hub. Anda juga harus memeriksa keamanan instalasi Anda dengan menilai apakah metode yang Anda pilih memungkinkan proyek yang tidak dipercaya untuk menjalankan perintah pada host Runner Anda. Meskipun ini membawa masalahnya sendiri, Docker-in-Docker adalah pendekatan teraman ketika instans GitLab Anda dapat diakses secara publik atau diakses oleh basis pengguna yang besar.

