Saya memiliki Dockerfile untuk menginstal server MySQL dalam sebuah wadah, yang kemudian saya mulai seperti ini:
sudo docker run -t -i 09d18b9a12be /bin/bash
Tetapi layanan MySQL tidak memulai secara otomatis, saya harus menjalankannya secara manual (dari dalam wadah):
service mysql start
Bagaimana cara saya memulai layanan MySQL secara otomatis saat menjalankan wadah buruh pelabuhan?
Jawaban:
Pertama, ada masalah di Anda
Dockerfile
:Gambar Docker tidak menyimpan proses yang sedang berjalan. Oleh karena itu,
RUN
perintah Anda dieksekusi hanya selamadocker build
fase dan berhenti setelah build selesai. Sebagai gantinya, Anda perlu menentukan perintah ketika wadah mulai menggunakanCMD
atauENTRYPOINT
perintah seperti di bawah ini:Kedua, wadah buruh pelabuhan membutuhkan proses (perintah terakhir) untuk tetap berjalan, jika tidak wadah akan keluar / berhenti. Oleh karena itu,
service mysql start
perintah normal tidak dapat digunakan secara langsung di Dockerfile.Larutan
Ada tiga cara khas agar proses tetap berjalan:
Menggunakan
service
perintah dan menambahkan perintah tanpa akhir setelah itu sukatail -F
Ini sering lebih disukai ketika Anda memiliki satu layanan berjalan karena membuat log yang dihasilkan dapat diakses oleh buruh pelabuhan.
Atau gunakan perintah foreground untuk melakukan ini
Ini hanya berfungsi jika ada skrip seperti
mysqld_safe
.Atau bungkus skrip Anda
start.sh
dan selesaikan iniIni yang terbaik jika perintah harus melakukan serangkaian langkah, sekali lagi,
/start.sh
harus tetap berjalan.Catatan
Untuk pemula
supervisord
tidak disarankan menggunakan . Jujur saja, itu berlebihan. Jauh lebih baik menggunakan layanan tunggal / perintah tunggal untuk wadah.BTW: silakan periksa https://registry.hub.docker.com untuk gambar mysql docker yang ada untuk referensi
sumber
docker exec -it <CONTAINER NAME> mysql /etc/init.d/mysqld restart
Di Anda
Dockerfile
, tambahkan di baris terakhirIni bekerja untuk saya
Dan inilah hasilnya:
sumber
docker stop
ataudocker restart
anggun, hanya saja bisa dibunuh.Sederhana! Tambahkan di akhir dockerfile:
sumber
Docker version 18.09.7, build 2d0083d
tanpa&& /bin/bash
layanan akan segera berhentiAda cara lain untuk melakukannya yang menurut saya lebih mudah dibaca.
Katakan bahwa Anda ingin memulai rabbitmq dan mongodb ketika Anda menjalankannya maka Anda
CMD
akan terlihat seperti ini:Karena Anda hanya dapat memiliki satu
CMD
perDockerfile
triknya adalah menggabungkan semua instruksi dengan&&
dan kemudian menggunakannya\
untuk setiap perintah untuk memulai baris baru.Jika Anda akhirnya menambahkan ke banyak dari mereka saya sarankan Anda meletakkan semua perintah Anda dalam file skrip dan mulai seperti @ larry-cai yang disarankan:
sumber
Dalam kasus saya, saya memiliki aplikasi web PHP yang dilayani oleh Apache2 dalam wadah buruh pelabuhan yang terhubung ke database backend MYSQL. Solusi Larry Cai bekerja dengan modifikasi kecil. Saya membuat
entrypoint.sh
file di mana saya mengelola layanan saya. Saya pikir membuatentrypoint.sh
ketika Anda memiliki lebih dari satu perintah untuk dijalankan ketika wadah Anda mulai adalah cara yang lebih bersih untuk bootstrap buruh pelabuhan.sumber
ENTRYPOINT ['your location']
instruksi ke file skrip. Jangan lupa untuk mengatur izin eksekusi pada skrip Anda.COPY entrypoint.sh /entrypoint.sh RUN chmod 755 /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
. Dalam contoh ini, saya menyalin titik masuk saya ke direktori root di wadah buruh pelabuhan.Saya memiliki masalah yang sama ketika saya ingin memulai layanan ssh secara otomatis. Saya menemukan append itu
untuk dapat menyelesaikannya, tetapi hanya Anda yang membukanya dengan bash yang akan melakukannya.sumber
Saya menambahkan kode berikut ke /root/.bashrc untuk menjalankan kode hanya sekali,
Harap komit wadah ke gambar sebelum menjalankan skrip ini, jika tidak file 'docker_services' akan dibuat dalam gambar dan tidak ada layanan yang akan dijalankan.
sumber
Inilah cara saya memulai layanan MySQL secara otomatis setiap kali wadah buruh pelabuhan berjalan.
Dalam kasus saya, saya perlu menjalankan tidak hanya MySQL tetapi juga PHP, Nginx dan Memcached
Saya memiliki baris berikut di Dockerfile
Menambahkan && bash akan membuat Nginx, MySQL, PHP dan Memcached berjalan di dalam wadah.
sumber
Ini tidak berfungsi
CMD service mysql start && /bin/bash
Ini tidak berfungsi
CMD service mysql start ; /bin/bash ;
- Saya kira mode interaktif tidak akan mendukung latar depan.
Ini bekerja !!
CMD service nginx start ; while true ; do sleep 100; done;
Ini bekerja !!
CMD service nginx start && tail -F /var/log/nginx/access.log
Waspadalah Anda harus menggunakan
docker run -p 80:80 nginx_bash
tanpa parameter perintah.sumber
Dokumentasi berikut dari situs web Docker menunjukkan bagaimana menerapkan layanan SSH dalam wadah buruh pelabuhan. Itu harus mudah beradaptasi untuk layanan Anda:
Variasi untuk pertanyaan ini juga telah diajukan di sini:
sumber
Mungkin perlu memangkas wadah yang ada menggunakan buruh pelabuhan ...
Impor dengan modifikasi yang diperlukan:
Jalankan wadah misalnya dengan opsi selalu restart untuk memastikannya akan dilanjutkan secara otomatis setelah host / daemon recycle:
Catatan tambahan: Menurut pendapat saya masuk akal untuk memulai hanya layanan cron yang meninggalkan wadah sebersih mungkin kemudian hanya memodifikasi crontab atau cron. Alasannya adalah Anda hanya bergantung pada satu daemon dan jika terjadi perubahan, lebih mudah menggunakan anonim atau boneka untuk mendistribusikan kembali skrip cron alih-alih layanan trek yang dimulai saat boot.
sumber