Catatan mikro tentang cara meluncurkan Docker dengan Systemd di dalam Gitlab CI Runner. Mungkin seseorang akan berguna, mungkin seseorang telah memecahkan masalah yang sama dengan cara lain dan itu akan menarik jika Anda berbagi komentar.
Kata PengantarGitlab Runner ditempatkan di dalam wadah Docker. Pada titik tertentu, muncul ide untuk mengumpulkan semua infrastruktur yang diperlukan (misalnya, PostgreSQL dan Tomcat) di dalam satu wadah untuk menginstal aplikasi setelah tahap kompilasi dan autotest berjalan. Wadah infrastruktur itu sendiri sudah dibangun berdasarkan gambar Debian dengan Systemd dan bekerja dengan sempurna. Tetapi ketika digunakan di dalam Runner, masalah yang tidak terduga dimulai. Kode langkah itu, untuk kesederhanaan, katakanlah ini:
run-autotests: image: debian/systemd before_script: - cp backend.jar /opt/ - cd /opt script: - java -jar autotests.jar
Semuanya tampak normal, tetapi pada saat startup langkah ini akan gagal dengan kesalahan yang systemd tidak berjalan sebagai proses dengan ID 1 atau mungkin kesalahan lain adalah bahwa systemd tidak berjalan sama sekali.
Apa masalahnya?
Ternyata - pada masalah baru tentang Gitlab sendiri, saya bukan satu-satunya yang menghadapi masalah ini.
Masalahnya adalah bahwa Gitlab Runner untuk wadah Docker selalu menimpa perintah CMD, mis. memulai wadah dengan perintah ini:
docker run --cmd /bin/bash ...
Dan tidak mungkin untuk mendefinisikan ulang CMD Gitlab, Anda hanya dapat menggunakan titik masuk di dalam skrip ci, tetapi menari dengannya tidak menghasilkan apa-apa.
Semua peran dicakup oleh tes molekul dan mereka berhasil melewati tes di dalam pelari GitLab. Setelah memperhatikan hal ini, saya berpikir, mengapa tidak meluncurkan wadah dengan systemd di dalam Runner yang berjalan, tentu saja, tetapi hasilnya lebih penting bagi saya daripada kesulitannya. Dimungkinkan untuk meluncurkan wadah menggunakan perintah buruh pelabuhan, tetapi itu tidak efektif, dan tidak akan ada penanganan kesalahan - entah bagaimana itu mungkin tidak terlalu dapat diprediksi, jadi saya memutuskan untuk menulis artikel buatan tangan kecil dengan Python yang hanya akan meluncurkan wadah, salin arsip dengan yang diperlukan file dan jalankan daftar perintah di dalam wadah.
→ Kode di sini:
GitHubAnda dapat menjalankannya seperti ini:
cd <path-with-code> pip install virtualenv virtualenv venv source venv/bin/activate pip install -r requirements.txt python main.py \ --image dramaturg/docker-debian-systemd
Perintah di [] adalah opsional. Makro {bash} khusus diperlukan untuk perintah yang memerlukan shell, misalnya, ls -la dan lainnya. Itu akan diganti oleh
/ bin / bash -c "command" saat runtime.
Saya menulis dengan Python untuk pertama kalinya, jadi jangan dimarahi. Mungkin akan ada masalah dalam kode atau saat startup, saya akan mencoba untuk memperbaikinya dengan cepat. Di sini saya mencoba menjelaskan ide sederhana umum tentang metode startup. Bagikan pengalaman Anda jika Anda memiliki masalah serupa.
Tentang gambar yang digunakan oleh dramaturg / docker-debian-systemdTidak ada keluhan tentang gambar ini, tetapi pada awalnya ada kesalahan yang muncul di konsol mesin host, bahwa beberapa file yang dibuat systemd sudah ada. Tidak ada masalah seperti itu di layanan Nginx, tetapi mereka muncul di PostgreSQL. Solusinya adalah menghapus blok “VOLUME [“ / sys / fs / cgroup “,“ / run “,“ / run / lock “,“ / tmp “]”, setelah itu semuanya bekerja seperti jam.