Cara mengedit file di kontainer buruh pelabuhan dihentikan / tidak memulai

94

Mencoba memperbaiki kesalahan dan masalah debug dengan aplikasi saya yang terbagi menjadi beberapa kontainer, saya sering mengedit file dalam kontainer:

  • entah saya malas sekali dan menginstal nano dan mengedit langsung di container atau

  • Saya buruh pelabuhan cp file keluar dari wadah, mengeditnya, menyalinnya kembali dan memulai ulang wadah

Itu adalah langkah-langkah perantara sebelum datang ke konten baru untuk pembuatan kontainer, yang membutuhkan waktu lebih lama daripada melakukan hal di atas (yang tentu saja hanya perantara / mengutak-atik).

Sekarang saya sering memutus program awal wadah, yang dalam kasus pelanggaran adalah skrip node atau skrip server web python, keduanya biasanya gagal karena kesalahan sintaks.

Apakah ada cara untuk menyimpan kontainer itu? Karena mereka tidak mulai, saya tidak bisa menjadi buruh pelabuhan eksekutif ke mereka, dan dengan demikian mereka hilang dari saya. Saya kemudian pergi ke rute rm / rmi / build / run setelah memperbaiki file yang menyinggung di input build.

Bagaimana cara mengedit file dalam penampung yang dihentikan, atau memasukkannya ke dalam atau memulai shell di penampung yang dihentikan - apa pun yang memungkinkan saya untuk memperbaiki penampung ini?

(Sepertinya bekerja pada komputer jarak jauh dan merusak konfigurasi jaringan - koneksi hilang "selamanya" dengan cara ini dan seseorang harus menggunakan fallback, jika ada.)

Bagaimana cara mengedit file kontainer Docker dari host? terlihat relevan tetapi sudah usang.

Andreas Reiff
sumber
Yang ini mungkin juga merupakan solusi stackoverflow.com/a/32353134/586754 - berharap untuk solusi yang lebih baik.
Andreas Reiff
1
mungkin Anda harus mempertimbangkan untuk memasang volume sehingga Anda dapat mengedit file di host Anda alih-alih di dalam penampung. Setelah puas dengan kode Anda, Anda bebas ke docker cpfile ke penampung (atau membuat gambar baru)
Thomasleveil
Ya, ini akan menjadi sedikit terlambat jika saya belum mengatur hal-hal seperti ini dari awal. Ini tidak berhasil untuk pemulihan, saya kira.
Andreas Reiff
Banyak pembaca hanya ingin melihat file daripada mengeditnya. Dalam kasus ini, Anda dapat menggunakan docker commitperintah untuk memecah gambar baru. name=$(docker commit); docker run -it $name /bin/shakan melakukan apa yang kamu inginkan.
Att Righ
jadi tampaknya sistem file kontainer yang dihentikan relatif permanen pada akhirnya?
Wanita

Jawaban:

140

Saya mengalami masalah dengan penampung yang tidak dapat dimulai karena perubahan konfigurasi yang buruk yang saya buat. Saya dapat menyalin file dari penampung yang dihentikan dan mengeditnya. sesuatu seperti:

docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .

(perbaiki file)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf
tomurie
sumber
22
Ini harus menjadi jawaban yang diterima. Untuk beberapa alasan saya tidak berpikir CP mengerjakan kontainer yang dihentikan. Bagus!
Perkiraan
Sempurna. Saya menyalin file dari wadah (saya tahu jalurnya) dan kemudian mengeditnya, dan kemudian menyalin kembali ke wadah ke lokasi yang sama. Bekerja untuk saya! Terima kasih!
Nawaz
Apakah ada cara untuk menghapus file?
kodlan
1
@kodlan Hanya jika ini hanya muncul di yang UpperDirAnda dapatkan dari docker container inspect- Anda harus bereksperimen untuk melihat bagaimana sistem overlay merepresentasikan file dalam struktur dasar yang telah dihapus di lapisan atas.
Tim Baverstock
Terima kasih, ini membantu saya memperbaiki container MySQL saya yang berjalan di docker di macOS.
mazedlx
60

Menjawab pertanyaanku sendiri .. masih berharap untuk jawaban yang lebih baik dari orang yang lebih berpengetahuan !!

Ada 2 kemungkinan.

1) Mengedit sistem file di host secara langsung . Ini agak berbahaya dan memiliki peluang untuk benar-benar merusak penampung, mungkin data lain tergantung pada apa yang salah.

2) Mengubah skrip startup menjadi sesuatu yang tidak pernah gagal seperti memulai bash, melakukan perbaikan / pengeditan dan kemudian mengubah program startup lagi ke program yang diinginkan (seperti node atau apa pun sebelumnya).

Keterangan lebih lanjut:

1) Menggunakan

docker ps

untuk menemukan wadah yang sedang berjalan atau

docker ps -a

untuk menemukan semua kontainer (termasuk yang dihentikan) dan

docker inspect (containername)

cari "Id", salah satu nilai pertama.

Ini adalah bagian yang berisi detail implementasi dan mungkin berubah, ketahuilah bahwa Anda mungkin kehilangan penampung dengan cara ini.

Pergi ke

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

dan di sana Anda akan menemukan semua file yang diubah menjadi gambar yang menjadi dasar container. Anda dapat menimpa file, menambah atau mengedit file.

Sekali lagi, saya tidak akan merekomendasikan ini.

2) Seperti yang dijelaskan di https://stackoverflow.com/a/32353134/586754 Anda dapat menemukan konfigurasi json config.json di jalur seperti

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

Di sana Anda dapat mengubah args dari misalnya "nodejs app.js" menjadi "/ bin / bash". Sekarang restart layanan buruh pelabuhan dan mulai penampung (Anda akan melihat bahwa sekarang dimulai dengan benar). Kamu harus menggunakan

docker start -i (containername)

untuk memastikannya tidak langsung berhenti. Anda sekarang dapat bekerja dengan wadah dan / atau nanti memasang dengan

docker exec -ti (containername) /bin/bash

Selain itu, docker cp cukup berguna untuk menyalin file yang diedit di luar container.

Juga, seseorang hanya boleh kembali ke langkah-langkah tersebut jika wadahnya lebih atau kurang "hilang", jadi setiap perubahan akan menjadi perbaikan.

Andreas Reiff
sumber
Masih berharap untuk jawaban yang lebih baik - jadi silakan memberikannya, saya akan memindahkan tag "ansered" juga.
Andreas Reiff
Saya menggunakan cara kedua dan saya harus memulai ulang layanan buruh pelabuhan untuk memaksa penimpaan config.jsonfile setiap kali saya mengeditnya
Vitaly Isaev
2
Saya memiliki config.v2.json dan setiap kali saya memulai wadah zombie, itu mengembalikan pembaruan Path / EntryPoint saya dan mati sekali lagi. Menggunakan "docker cp" untuk mengupdate script entrypoint.sh untuk menjalankan bash, memperbaikinya.
Curtis Yallop
@CurtisYallop Saya mengalami hal yang sama. Bagaimana Anda mengatasinya?
Brett McLain
1
@BrettMcLain Saya menggunakan docker cp daripada mengeditnya di host. Seperti ini: Temukan lokasi skrip titik masuk: "docker inspect container_name | grep Entry". Dapatkan skrip: "docker cp container_name: /entrypoint.sh ./". (Edit) Masukkan kembali skrip ke dalam wadah: "docker cp entrypoint.sh container_name: /entrypoint.sh". Anda dapat membuat entry point run bash atau menjalankan sleep loop misalnya "while:; do sleep 10; done". Baris skrip pertama harus "#! / Bin / bash".
Curtis Yallop
9

Anda dapat mengedit sistem file kontainer secara langsung, tetapi saya tidak tahu apakah itu ide yang bagus. Pertama, Anda perlu menemukan jalur direktori yang digunakan sebagai root runtime untuk container. Lari docker container inspect id/name. Cari kunci UpperDirdalam keluaran JSON.

Itu adalah direktori Anda.

Tejas Sarade
sumber
Menemukan direktori, tetapi tidak berisi semua file.
aioobe
Ini adalah OverlayFS, jadi file Anda harus ada di direktori tersebut.
Tejas Sarade
Nama direktori bisa berbeda dari "UpperDir", misalnya, dalam kasus saya ini adalah Sumber. Tapi itu berhasil!
Rajni Kewlani
0

Jika Anda mencoba untuk memulai ulang penampung yang dihentikan dan perlu mengubah penampung karena kesalahan konfigurasi tetapi penampung tidak dapat dimulai, Anda dapat melakukan hal berikut yang berfungsi menggunakan perintah "docker cp" (mirip dengan saran sebelumnya). Prosedur ini memungkinkan Anda menghapus file dan melakukan perubahan lain yang diperlukan. Jika beruntung, Anda dapat melewati banyak langkah di bawah ini.

  1. Gunakan buruh pelabuhan inspect untuk menemukan entrypoint, (bernama Path di beberapa versi)
  2. Buat tiruan dari penggunaan buruh pelabuhan
  3. Masukkan clone menggunakan docker exec -ti bash (jika * nix container)
  4. Temukan lokasi file entrypoint dengan melihat klon untuk menemukan
  5. Salin skrip entrypoint lama menggunakan docker cp: ./
  6. Ubah atau buat skrip entrypoint baru misalnya

    #!/bin/bash tail -f /etc/hosts

  7. pastikan skrip memiliki hak eksekusi
  8. Ganti entrypoint lama menggunakan docker cp ./:
  9. mulai wadah lama menggunakan start
  10. ulangi langkah 6-9 hingga awal
  11. Perbaiki masalah dalam penampung
  12. Pulihkan entrypoint jika perlu dan ulangi langkah 6-9 sesuai kebutuhan
  13. Hapus klon jika perlu
pengguna6830669
sumber