Docker - Container tidak berjalan

92

Saya benar-benar pemula di buruh pelabuhan. Saya mencoba memulai penampung keluar seperti berikut,

  1. Saya mendaftar semua wadah yang tersedia menggunakan docker ps -a. Itu tercantum sebagai berikut:

    buruh pelabuhan daftar semua gambar

  2. Saya memasukkan perintah berikut untuk memulai wadah yang berada di tahap keluar dan masuk ke terminal gambar itu.

    docker start 79b3fa70b51d
    docker exec -it 79b3fa70b51d /bin/sh
    
  3. Itu melempar kesalahan berikut.

    FATA[0000] Error response from daemon: Container 79b3fa70b51d is not running

Tapi ketika saya mulai menggunakan wadah docker start 79b3fa70b51d. Itu melempar ID penampung sebagai keluaran yang normal jika semuanya bekerja normal. Saya tidak yakin apa yang menyebabkan kesalahan ini. Ide tentang penyebab dan saran tentang ini akan sangat membantu saya. Terima kasih sebelumnya.

Orang asing
sumber
7
Hai, Bisakah Anda menjelaskan bagaimana Anda menyelesaikan masalah ini. Saya khawatir jawaban di bawah tidak masuk akal
JayPex
4
@ApexFred, kontainer Docker tidak seperti VM; mereka dirancang untuk menjalankan aplikasi. Ketika aplikasi berakhir, begitu pula wadahnya. Dalam kasus ini, pengguna telah menyetel "aplikasi" untuk wadah ke perintah "echo". Karena perintah "echo" melakukan gema dan kemudian berhenti, penampung juga berhenti dengan perintah tersebut. Jika dia memulai wadah lagi, itu melakukan gema dan sekali lagi berhenti. Perintah EXEC membutuhkan wadah yang berjalan. Karena penampung telah dihentikan, itu tidak dapat digunakan untuk menjalankan perintah tambahan.
duct_tape_coder

Jawaban:

31

Penampung 79b3fa70b51dtampaknya hanya melakukan echo.

Artinya itu dimulai, bergema dan kemudian segera keluar.

docker execPerintah berikutnya tidak akan menemukannya berjalan untuk melampirkan sendiri ke penampung itu dan menjalankan perintah apa pun: sudah terlambat. Penampung sudah keluar.

The docker execperintah menjalankan perintah baru dalam wadah berjalan.

Perintah yang mulai digunakan docker exechanya akan berjalan saat proses utama penampung (PID 1) sedang berjalan

VonC
sumber
1
Hai VonC, terima kasih atas komentar Anda. Bagaimana saya bisa mencapai untuk masuk ke terminal gambar?
Stranger
3
@Udhayakumar Sederhana docker run -it --rm udhayakumar/busyboxwithtouchseharusnya cukup untuk membuka sesi. Titik masuk default harus / bin / sh, tetapi itu tergantung pada Dockerfile Anda: Anda mungkin telah menentukan titik masuk dan / atau CMD yang berbeda.
VonC
51
Hai, Bisakah Anda menjelaskan bagaimana Anda menyelesaikan masalah ini. Saya khawatir jawaban ini tidak masuk akal
JayPex
2
@Jawad Dengan menjalankan busyboxwithtouch tanpa parameter apa pun, defaultnya adalah shell interaktif (yang tidak langsung keluar). Itu berarti Anda nanti bisa ( docker exec) melampirkannya.
VonC
62

Secara default, penampung buruh pelabuhan akan segera keluar jika Anda tidak memiliki tugas apa pun yang berjalan di penampung tersebut.

Agar penampung tetap berjalan di latar belakang, coba jalankan dengan --detach(atau -d) argumen.

Contoh:

docker pull debian

docker run -t -d --name my_debian debian
e7672d54b0c2

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e7672d54b0c2        debian              "bash"              3 minutes ago       Up 3 minutes                            my_debian

#now you can execute command on the container
docker exec -it my_debian bash
root@e7672d54b0c2:/# 
Dio Phung
sumber
Itu seharusnya jawabannya, bagus.
SAYA
22

Jika tidak memungkinkan untuk memulai proses utama lagi (untuk waktu yang cukup lama), ada juga kemungkinan untuk commitpenampung ke gambar baru dan menjalankan penampung baru dari gambar ini. Meskipun ini bukan alur kerja praktik terbaik yang biasa , saya merasa sangat berguna untuk men-debug skrip yang gagal sesekali.

docker exec -it 6198ef53d943 bash
Error response from daemon: Container 6198ef53d9431a3f38e8b38d7869940f7fb803afac4a2d599812b8e42419c574 is not running

docker commit 6198ef53d943
sha256:ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33

docker run -it ace7ca65e6e bash
root@72d38a8c787d:/#
Matthias Kuhn
sumber
Saya telah mengikuti langkah yang sama tetapi wadah yang baru dibuat tidak dapat diakses dari browser yang dapat diakses sebelumnya
Muhammad Muazzam
1
Harap dicatat bahwa perintah meluncurkan bashproses dalam penampung. Anda mungkin menjalankan server web sebelumnya sehingga Anda harus memeriksa perintah mana yang perlu digunakan untuk mengaktifkan kembali server.
Matthias Kuhn
10

Pertama-tama, kita harus menjalankan container buruh pelabuhan

ankit@ankit-HP-Notebook:~$  sudo docker start 3a19b39ea021

                        3a19b39ea021

Setelah itu, periksa container buruh pelabuhan:

ankit@ankit-HP-Notebook:~$  sudo docker ps -a

 CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                   PORTS               NAMES

  3a19b39ea021        coreapps/ubuntu16.04:latest   "bash"              13 hours ago        
  Up 9 seconds                                 ubuntu1

  455b66057060        hello-world                   "/hello"            4 weeks ago         

Exited (0) 4 weeks ago                       vigorous_bardeen

Kemudian jalankan dengan menggunakan perintah di bawah ini:

ankit@ankit-HP-Notebook:~$  sudo docker exec -it 3a19b39ea021 bash

root@3a19b39ea021:/# 
Ankit gupta
sumber
Akan sangat membantu jika menambahkan teks yang membantu menjelaskan jawaban Anda.
Lauren Van Sloun
9

Ini terjadi dengan gambar yang layanannya tidak diluncurkan oleh skrip yang menunggu permintaan , oleh karena itu penampung keluar di akhir skrip.

Ini biasanya terjadi pada kebanyakan gambar OS dasar (centos, debian, dll.), Atau juga dengan gambar node .

Taruhan terbaik Anda adalah menjalankan gambar dalam mode interaktif . Contoh di bawah ini dengan gambar node :

docker run -it node /bin/bash

Outputnya adalah

root@cacc7897a20c:/# echo $SHELL
/bin/bash
Michael P. Bazos
sumber
5

Inilah yang berhasil untuk saya.

Dapatkan ID penampung dan mulai ulang.

docker ps -a --no-trunc 

ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33


docker restart ace7ca65e6e3fdb678d9cdfb33a7a165c510e65c3bc28fecb960ac993c37ef33
z atef
sumber
3

Alasannya adalah apa yang dikatakan jawaban yang diterima. Saya menambahkan beberapa informasi tambahan, yang dapat memberikan pemahaman lebih lanjut tentang masalah ini.

  1. Status wadah meliputi Created, Running, Stopped, Exited, Deaddan lain-lain yang saya tahu.
  2. Saat kami mengeksekusi docker create, daemon buruh pelabuhan akan membuat sebuah kontainer dengan statusnya Created.
  3. Ketika docker start, daemon buruh pelabuhan akan memulai penampung yang ada yang statusnya mungkin Createdatau Stopped.
  4. Saat kami mengeksekusi docker run , daemon buruh pelabuhan akan menyelesaikannya dalam dua langkah: docker createdan docker start.
  5. Ketika docker stop, jelas daemon buruh pelabuhan akan menghentikan sebuah kontainer. Dengan demikian wadah akan masukStopped berstatus.
  6. Datang yang paling penting, sebuah wadah sebenarnya membayangkan dirinya memegang proses waktu yang lama di dalamnya. Saat proses keluar, proses penahanan kontainer akan keluar juga. Dengan demikian status wadah ini nantinyaExited .

Kapan prosesnya keluar? Dengan kata lain, bagaimana prosesnya, bagaimana kita memulainya?
Jawabannya ada CMDdi file docker atau commanddalam ekspresi berikut, yang secara bashdefault di beberapa gambar, yaitu ubutu: 18.04.

docker run ubuntu:18.04 [command]
Light.G
sumber
3

docker run -it <image_id> /bin/bash

Jalankan dalam mode interaktif dengan menjalankan bash shell

Syeda Arshiya
sumber
1
Saya pikir -dbenderanya salah ketik di sini?
2

Bagi siapa pun yang mencoba sesuatu yang serupa menggunakan Dockerfile ...

Berjalan dalam mode terpisah tidak akan membantu. Penampung akan selalu keluar (berhenti berjalan) jika perintahnya tidak memblokir, hal ini terjadi pada bash.

Dalam kasus ini, solusinya adalah: 1. Lakukan gambar yang dihasilkan: (container_name = nama container yang ingin Anda gunakan untuk mendasarkan gambar, image_name = nama gambar yang akan dibuat docker commit container_name image_name 2. Gunakan buruh pelabuhan menjalankan untuk membuat kontainer baru menggunakan gambar baru, menentukan perintah yang ingin Anda jalankan. Di sini, saya akan menjalankan "bash": docker run -it image_name bash

Ini akan memberi Anda login interaktif yang Anda cari.

ldobson
sumber
1

Berikut adalah solusi ketika container buruh pelabuhan keluar secara normal dan Anda dapat mengedit Dockerfile.

Umumnya, ketika kontainer buruh pelabuhan dijalankan, aplikasi dilayani dengan menjalankan perintah. Dari referensi Dockerfile ,

Baik instruksi CMD dan ENTRYPOINT menentukan perintah apa yang akan dijalankan saat menjalankan container. ... Dockerfile harus menentukan setidaknya satu dari perintah CMD atau ENTRYPOINT.

Saat Anda membuat gambar dan tidak menentukan perintah apa pun dengan CMD atau ENTRYPOINT, perintah CMD atau ENTRYPOINT gambar dasar akan dijalankan.

Misalnya, Dockerfile Resmi Ubuntu memiliki CMD ["/bin/bash"]( https://hub.docker.com/_/ubuntu ). Sekarang, bin/bash/perintah dapat menerima masukan dan docker run -it IMAGE_IDperintah melampirkan STDIN ke penampung. Hasilnya adalah Anda mendapatkan terminal interaktif dan penampung terus berjalan.

Ketika perintah dengan CMD atau ENTRYPOINT ditentukan di Dockerfile, perintah ini akan dijalankan saat menjalankan container. Sekarang, jika perintah ini dapat selesai tanpa memerlukan input apa pun, perintah akan selesai dan container akan keluar. TIDAKdocker run -it IMAGE_ID akan menyediakan terminal interaktif dalam kasus ini. Contohnya adalah image buruh pelabuhan yang dibangun dari Dockerfile di bawah ini-

FROM ubuntu
ENTRYPOINT echo hello 

Jika Anda perlu pergi ke terminal gambar ini, Anda harus menjaga kontainer tetap berjalan dengan memodifikasi perintah entrypoint.

FROM ubuntu
ENTRYPOINT echo hello && sleep infinity 

Setelah menjalankan penampung secara normal docker run IMAGE_ID, Anda bisa pergi ke terminal lain dan menggunakan docker exec -it CONTAINER_ID bashuntuk mendapatkan terminal penampung.

Sadman Sakib
sumber
"dan Anda dapat mengedit Dockerfile": titik kunci di sini. Suara positif.
VonC
0

Dalam kasus saya, saya mengubah nama file dan nama direktori tertentu dari direktori induk Dockerfile. Karena penampung mana tidak menemukan parameter yang diperlukan untuk memulainya lagi.

Setelah mengganti namanya kembali ke nama aslinya, wadah dimulai seperti mentega.

ross
sumber
0

Saya memiliki pandangan berbeda tentang ini. Saya dapat melakukan docker psdan melihat bahwa ada kontainer buruh pelabuhan yang berjalan, saya bahkan mencoba untuk memulainya kembali, tetapi segera setelah saya mencoba untuk mendapatkan sesi untuk itu dengan New-PSSession -ContainerId $containerId -RunAsAdministratorItu akan kesalahan, mengatakan:

## [error] New-PSSession: Masukan ContainerId xxx tidak ada, ## [error] atau penampung terkait tidak berjalan.

Masalah saya adalah saya menjalankan dengan layanan jaringan dan tidak memiliki cukup izin untuk melihat wadah, meskipun saya telah memberinya izin untuk menjalankan perintah buruh pelabuhan (dengan konfigurasi grup keamanan buruh pelabuhan)

Saya tidak tahu cara mengaktifkan bekerja dengan container, jadi saya harus kembali menjalankannya sebagai pengguna admin

Benar-benarFreeWeb
sumber