Saya menjalankan wadah di latar belakang menggunakan
docker run -d --name hadoop h_Service
keluar dengan cepat. Tetapi jika saya berlari di latar depan, itu berfungsi dengan baik. Saya memeriksa log menggunakan
docker logs hadoop
tidak ada kesalahan. Ada ide?
DOCKERFILE
FROM java_ubuntu_new
RUN wget http://archive.cloudera.com/cdh4/one-click-install/precise/amd64/cdh4-repository_1.0_all.deb
RUN dpkg -i cdh4-repository_1.0_all.deb
RUN curl -s http://archive.cloudera.com/cdh4/ubuntu/precise/amd64/cdh/archive.key | apt-key add -
RUN apt-get update
RUN apt-get install -y hadoop-0.20-conf-pseudo
RUN dpkg -L hadoop-0.20-conf-pseudo
USER hdfs
RUN hdfs namenode -format
USER root
RUN apt-get install -y sudo
ADD . /usr/local/
RUN chmod 777 /usr/local/start-all.sh
CMD ["/usr/local/start-all.sh"]
start-all.sh
#!/usr/bin/env bash
/etc/init.d/hadoop-hdfs-namenode start
/etc/init.d/hadoop-hdfs-datanode start
/etc/init.d/hadoop-hdfs-secondarynamenode start
/etc/init.d/hadoop-0.20-mapreduce-tasktracker start
sudo -u hdfs hadoop fs -chmod 777 /
/etc/init.d/hadoop-0.20-mapreduce-jobtracker start
/bin/bash
chmod 777
adalah tidak aman dan salah. Anda harus kembali ke izin waras (mungkin 755 dalam kasus ini).Jawaban:
Wadah buruh pelabuhan keluar saat proses utamanya selesai.
Dalam hal ini, ia akan keluar ketika
start-all.sh
skrip Anda berakhir. Saya tidak cukup tahu tentang hadoop untuk memberi tahu Anda bagaimana melakukannya dalam kasus ini, tetapi Anda harus membiarkan sesuatu berjalan di latar depan atau menggunakan manajer proses seperti runit atau supervisor untuk menjalankan proses.Saya pikir Anda pasti salah tentang hal itu berfungsi jika Anda tidak menentukan
-d
; seharusnya memiliki efek yang persis sama. Saya menduga Anda meluncurkannya dengan perintah yang sedikit berbeda atau menggunakan-it
yang akan mengubah segalanya.Solusi sederhana mungkin dengan menambahkan sesuatu seperti:
while true; do sleep 1000; done
sampai akhir skrip. Saya tidak suka ini, karena skrip harus benar-benar memantau proses yang dimulai.
(Saya harus mengatakan saya mencuri kode itu dari https://github.com/ followingenceiq/hadoop-docker/blob/master/ bootstrap.sh )
sumber
Ini melakukan trik untuk saya:
Setelah itu, saya memeriksa proses yang berjalan menggunakan:
Untuk memasang kembali wadah
TIP: Untuk keluar tanpa menghentikan jenis wadah:
^P^Q
sumber
-dit
hanya singkatan-di
adalah minimum yang diperlukan,-t
opsi ini berlebihan jika digunakan dengan-d
jika saya mengerti dengan benar-t
mengaktifkan ... tapi karena saya biasanyaexec
bash baru setiap kali saya tidak melihat. Saya memiliki masalah melepaskan diri dari mac tetapi mungkin saya melakukan ini salah ..Saya ingin memperpanjang atau berani saya katakan, tingkatkan jawaban yang disebutkan oleh camposer
Ketika kamu berlari
Anda pada dasarnya menjalankan wadah di latar belakang dalam mode interaktif.
Ketika Anda melampirkan dan keluar dari wadah dengan CTRL + D (cara paling umum untuk melakukannya), Anda menghentikan wadah karena Anda baru saja membunuh proses utama yang Anda mulai wadah Anda dengan perintah di atas.
Memanfaatkan wadah yang sudah berjalan, saya hanya akan melakukan proses bash lain dan mendapatkan TTY semu dengan menjalankan:
sumber
setiap kali saya ingin sebuah wadah tetap terjaga setelah menyelesaikan skrip saya tambahkan
di akhir perintah. Jadi seharusnya:
sumber
Jika Anda ingin memaksa gambar untuk nongkrong (untuk men-debug sesuatu atau memeriksa keadaan sistem file) Anda dapat mengganti titik masuk untuk mengubahnya menjadi shell:
sumber
Pendekatan yang bagus adalah memulai proses dan layanan Anda menjalankannya di latar belakang dan menggunakan
wait [n ...]
perintah di akhir skrip Anda. Dalam bash, perintah tunggu memaksa proses saat ini untuk:Saya mendapat ide ini dari skrip awal Sébastien Pujadas untuk build elk-nya .
Mengambil dari pertanyaan awal, start-all.sh Anda akan terlihat seperti ini ...
sumber
Tambahkan ini ke akhir Dockerfile:
Contoh file Docker:
Referensi
sumber
CMD tail -f /dev/null
menjalankannyash -c "..."
. Bisakah kita menggunakanexec
formulir saja? YaituCMD ["tail", "-f", "/dev/null"]
Praktik saya adalah di Dockerfile memulai shell yang tidak akan segera keluar
CMD [ "sh", "-c", "service ssh start; bash"]
, kemudian jalankandocker run -dit image_name
. Dengan cara ini layanan (ssh) dan wadah berjalansumber
Saya menambahkan
read
pernyataan shell di akhir. Ini menjaga proses utama wadah - skrip startup shell - berjalan.sumber
Menambahkan
pada akhir skrip shell saya adalah perbaikan saya!
sumber
Jika Anda memeriksa Dockerfile dari wadah, misalnya fballiano / magento2-apache-php
Anda akan melihat bahwa di akhir file-nya ia menambahkan perintah berikut: while true; tidurlah 1; selesai
Sekarang, apa yang saya rekomendasikan, adalah Anda melakukan ini
Kemudian, Anda akan melihat apakah gambar buruh pelabuhan Anda memiliki kesalahan, jika keluar dengan 0, maka mungkin perlu salah satu dari perintah ini yang akan tidur selamanya.
sumber
Ada banyak cara yang memungkinkan galangan untuk segera keluar. Bagi saya, itu adalah masalah saya
Dockerfile
. Ada bug di file itu. SayaENTRYPOINT ["dotnet", "M4Movie_Api.dll]
bukannyaENTRYPOINT ["dotnet", "M4Movie_Api.dll"]
. Seperti yang Anda lihat, saya telah melewatkan satu kutipan (") di akhir.Untuk menganalisis masalah saya memulai wadah saya dan dengan cepat memasang wadah saya sehingga saya bisa melihat apa masalah sebenarnya.
Di mana 4ea373efa21b adalah id wadah saya. Ini mendorong saya ke masalah sebenarnya.
Setelah menemukan masalah, saya harus membangun, mengembalikan, menerbitkan wadah saya lagi.
sumber
Berasal dari duplikat, saya tidak melihat jawaban apa pun di sini yang membahas antipattern yang sangat umum dalam menjalankan beban kerja utama Anda sebagai pekerjaan latar belakang, dan kemudian bertanya-tanya mengapa Docker keluar.
Secara sederhana, jika Anda punya
lalu keluarkan
&
untuk menjalankan pekerjaan di latar depan, atau tambahkandi akhir skrip untuk membuatnya menunggu semua pekerjaan latar belakang.
Itu kemudian akan tetap keluar jika beban kerja utama keluar, jadi mungkin jalankan ini dalam satu
while true
lingkaran untuk memaksanya restart selamanya:(Perhatikan juga cara menulis
while true
. Adalah umum untuk melihat hal-hal konyol sepertiwhile [ true ]
atauwhile [ 1 ]
yang kebetulan bekerja, tetapi tidak berarti apa yang mungkin dibayangkan oleh penulis.)sumber
Anda perlu menjalankannya dengan -d flag untuk membiarkannya berjalan sebagai daemon di latar belakang.
sumber
Anda dapat menjalankan wadah menggunakan flag restart ini.
sumber
Karena gambar tersebut adalah linux, satu hal yang perlu diperiksa adalah memastikan setiap skrip shell yang digunakan dalam wadah memiliki akhiran baris unix. Jika mereka memiliki ^ M di akhir maka mereka adalah ujung baris windows. Salah satu cara untuk memperbaikinya adalah dengan dos2unix di /usr/local/start-all.sh untuk mengubahnya dari windows ke unix. Menjalankan docker dalam mode interaktif dapat membantu memecahkan masalah lain. Anda dapat memiliki salah ketik nama file atau sesuatu. lihat https://en.wikipedia.org/wiki/Newline
sumber