Bagaimana cara saya mengedit file setelah saya shell ke wadah Docker?

518

Saya berhasil melakukan shell ke wadah Docker menggunakan:

docker exec -i -t 69f1711a205e bash

Sekarang saya perlu mengedit file dan saya tidak memiliki editor di dalamnya:

root@69f1711a205e:/# nano
bash: nano: command not found
root@69f1711a205e:/# pico
bash: pico: command not found
root@69f1711a205e:/# vi
bash: vi: command not found
root@69f1711a205e:/# vim
bash: vim: command not found
root@69f1711a205e:/# emacs
bash: emacs: command not found
root@69f1711a205e:/#

Bagaimana cara saya mengedit file?

Igor Barinov
sumber
@Opal Saya menggunakan confluent / postgres-bw: 0,1
Igor Barinov
2
@Opal apt-get install vim works. Terima kasih!
Igor Barinov
3
jadi mengapa tidak membuat Dockerfiledan memasukkan perintah apt-get install dan hasilkan wadah Anda sendiri? Wadah Docker dirancang seperti ini, bukan dengan cara Anda.
BMW
1
buruh pelabuhan harus menginstal di sewa pada editor tes, setidaknya vim secara default
Bawantha

Jawaban:

726

Seperti dalam komentar, tidak ada set editor default - aneh - $EDITORvariabel lingkungan kosong. Anda dapat masuk ke dalam wadah dengan:

docker exec -it <container> bash

Dan lari:

apt-get update
apt-get install vim

Atau gunakan Dockerfile berikut:

FROM  confluent/postgres-bw:0.1

RUN ["apt-get", "update"]
RUN ["apt-get", "install", "-y", "vim"]

Gambar Docker dikirim dipangkas ke minimum - sehingga tidak ada editor yang diinstal dengan wadah yang dikirim. Itu sebabnya ada kebutuhan untuk menginstalnya secara manual.

EDIT

Saya juga mendorong Anda membaca posting saya tentang topik tersebut.

Opal
sumber
3
Yang Anda butuhkan adalah memasang volume: docs.docker.com/userguide/dockervolumes
Opal
16
Saya perlu masuk sebagai root untuk menyelesaikan ini docker exec -u 0 -it container_name bash.
Eng.Fouad
34
Seperti halnya buruh pelabuhan, mungkin lebih baik menginstalnya vim-tiny.
ryenus
2
Mungkin Anda bisa mempertimbangkan untuk tidak menginstal editor di setiap wadah yang Anda lampirkan, tetapi hanya sekali pada mesin host buruh pelabuhan. Seperti komentator lain menyebutkan Anda dapat memasang volume, sehingga Anda dapat mengedit file yang akan dipasang, atau menavigasi ke data kontainer itu sendiri dan mengedit file di/var/lib/docker/
Pitt
4
Saya hanya ingin mengubah satu konfigurasi dari true ke false dalam wadah. apt-gettidak berfungsi karena masalah izin di dalam wadah, jadi saya mencoba sed -i 's/texttobechanged/textwanted/g' filename. Ini berhasil untuk saya.
Amreesh Tyagi
422

Jika Anda tidak ingin menambahkan editor hanya untuk membuat beberapa perubahan kecil (misalnya, mengubah konfigurasi Tomcat), Anda bisa menggunakan:

docker cp <container>:/path/to/file.ext .

yang menyalinnya ke mesin lokal Anda (ke direktori Anda saat ini). Kemudian edit file secara lokal menggunakan editor favorit Anda, dan kemudian lakukan

docker cp file.ext <container>:/path/to/file.ext

untuk mengganti file lama.

hkong
sumber
21
@ Igor Ini sebenarnya harus menjadi solusi yang diterima karena ini adalah cara yang tepat untuk melakukannya tanpa menambahkan paket tambahan ke wadah Anda, sementara menambahkan paket harus menjadi solusi sekunder.
Routhinator
1
Untuk platform Windows, Anda dapat menggunakan, misalnya: docker cp <container>:C:\inetpub\wwwroot\Web.config .dan docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares
1
Solusi yang bagus untuk tujuan pengujian! Saya tidak merekomendasikan melakukannya dalam produksi.
Michal Šípek
9
Dan apa yang Anda rekomendasikan untuk produksi? Haruskah orang mengedit file dalam wadah secara interaktif dalam produksi?
lucid_dreamer
4
Patut dicatat bahwa metode ini mengubah kepemilikan file. Itu mungkin tetapi sedikit fiddly untuk mengubahnya kembali setelah itu dengan masuk ke wadah sebagai root ( docker exec -u 0 -it mycontainer bash) dan kemudian menjalankan chownperintah.
Steve Chambers
91

Anda dapat menggunakannya catjika sudah terpasang, yang kemungkinan besar akan terjadi jika itu bukan wadah kosong / mentah. Ini berfungsi dalam keadaan darurat, dan ok ketika menyalin + menempel ke editor yang tepat secara lokal.

cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c / (better: ctrl-d)
cat file

catakan menampilkan setiap baris saat menerima baris baru. Pastikan untuk menambahkan baris baru untuk baris terakhir itu. ctrl-c mengirimkan SIGINTkucing for untuk keluar dengan anggun. Dari komentar Anda melihat bahwa Anda juga dapat menekan ctrl-d untuk menunjukkan akhir file ("tidak ada lagi input yang masuk").

Pilihan lain adalah sesuatu seperti infilteryang menyuntikkan proses ke dalam wadah namespace dengan beberapa keajaiban ptrace: https://github.com/yadutaf/infilter

meijsermans
sumber
3
Ini sangat berguna jika ada masalah izin instilasi!
Roman
17
ctrl+Dlebih baik daripada ctrl+C. ctrl+Dmengirimkan sebuah EOF. Anda tidak perlu menambahkan baris baru ekstra di akhir. Dengan ctrl+C, jika Anda lupa menambahkan baris baru, Anda akan kehilangan baris terakhir!
wisbucky
1
@wisbucky Bagus! Bahkan lebih baik. Mungkin perlu ctrl-d dua kali.
meijsermans
52

Agar gambar Docker Anda kecil, jangan pasang editor yang tidak perlu. Anda dapat mengedit file melalui SSH dari host Docker ke wadah:

vim scp://remoteuser@containerip//path/to/document
Matius
sumber
2
Terima kasih. Saya ingin meninggalkan tautan ini yang menjelaskan vim scp:// vim.wikia dengan lebih baik . Juga, untuk mendapatkan alamat IP kontainer Anda, Anda dapat menggunakansudo docker inspect <container_id> | grep "IPAddress"
aJetHorn
1
Hanya ingin tahu, apakah saya benar-benar menggunakan "remoteuser", atau "buruh pelabuhan"? Saya sudah mencoba: vim scp://[email protected]//data/gitea/conf/app.iniserta vim scp://[email protected]//data/gitea/conf/app.inidan mereka berdua hanya membuat baru, file yang kosong.
J. Scott Elblein
1
@ J.ScottElblein Ini membutuhkan konfigurasi sshpada wadah buruh pelabuhan Anda terlebih dahulu. Lihat blog.softwaremill.com/… . Tetapi Anda umumnya tidak ingin memasang sshdi wadah Anda.
wisbucky
14

Kadang-kadang Anda harus menjalankan wadah dengan root:

docker exec -ti --user root <container-id> /bin/bash

Kemudian dalam wadah, untuk menginstal Vim atau yang lain:

apt-get install vim
yan
sumber
7

Saya menggunakan "docker run" (bukan "docker exec"), dan saya berada di zona terbatas tempat kami tidak dapat menginstal editor. Tapi saya punya editor di host Docker.

Solusi saya adalah: Bind mount volume dari host Docker ke wadah ( https://docs.docker.com/engine/reference/run/#/volume- Shared-filesystems), dan edit file di luar wadah. Ini terlihat seperti ini:

docker run -v /outside/dir:/container/dir

Ini sebagian besar untuk percobaan, dan kemudian saya akan mengubah file ketika membangun gambar.

ynux
sumber
6

Setelah Anda mengupas wadah Docker, ketik saja:

apt-get update
apt-get install nano
Dos
sumber
6

Anda dapat membuka file yang ada dengan

cat filename.extension

dan salin semua teks yang ada di clipboard.

Kemudian hapus file lama dengan

rm filename.extension

atau ganti nama file lama dengan

mv old-filename.extension new-filename.extension

Buat file baru dengan

cat > new-file.extension

Kemudian rekatkan semua teks yang disalin pada clipboard, tekan Enterdan keluar dengan menyimpan dengan menekan ctrl+z. Dan voila tidak perlu menginstal editor apa pun.

xD3ath
sumber
5

Anda bisa mengedit file di host dan menyalinnya dengan cepat dan menjalankannya di dalam wadah. Berikut ini pintasan satu-baris untuk menyalin dan menjalankan file Python:

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py
David Dehghan
sumber
1
Bagaimana itu menjawab pertanyaan? - "Bagaimana cara saya mengedit file?"
Peter Mortensen
4

Untuk operasi edit umum saya lebih suka menginstal vi( vim-tiny ), yang hanya menggunakan 1491 kB atau nanoyang menggunakan 1707 kB .

Di sisi lain vimmenggunakan 28,9 MB .

Kita harus ingat bahwa untuk apt-get installdapat bekerja, kita harus melakukan updateyang pertama kali, jadi:

apt-get update
apt-get install vim-tiny

Untuk memulai editor di CLI kita harus masuk vi.

simhumileco
sumber
2

Jika Anda menggunakan wadah Windows dan ingin mengubah file apa pun, Anda bisa mendapatkan dan menggunakan Vim di konsol Powershell dengan mudah.

Untuk dikupas ke wadah Windows Docker dengan PowerShell:

docker exec -it <name> powershell

  • Pertama instal manajer paket Chocolatey

    Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression;

  • Instal Vim

    choco install vim

  • Refresh VARIABEL LINGKUNGAN Anda dapat exitdan kembali ke wadah

  • Pergi ke lokasi file dan VIM vim file.txt

Aidar Gatin
sumber
1

Agak edan, tetapi dalam keadaan darurat Anda dapat menggunakan sedatau awkuntuk mengedit kecil atau menghapus teks. Berhati-hatilah dengan target regex Anda dan berhati-hatilah bahwa Anda kemungkinan berada rootdi wadah Anda dan mungkin harus menyesuaikan kembali izin.

Misalnya, menghapus baris penuh yang berisi teks yang cocok dengan regex:

awk '!/targetText/' file.txt > temp && mv temp file.txt

(Lebih)

menjadi lebih baik
sumber
1

Cara mudah untuk mengedit beberapa baris adalah:

echo "deb http://deb.debian.org/debian stretch main" > sources.list
Saubhagya Srivastava
sumber
1

Lihat pertanyaan Stack Overflow dan edit file pada tempatnya

Ini akan menjadi pilihan yang baik di sini, jika:

  1. Untuk memodifikasi file besar, tidak mungkin digunakan cat.
  2. Instal Vim tidak diperbolehkan atau terlalu lama. Situasi saya menggunakan MySQL 5.7 gambar ketika saya ingin mengubah my.cnfberkas, tidak ada vim, vidan Vim menginstal terlalu lama (Cina Great Firewall). seddisediakan dalam gambar, dan itu cukup sederhana. Penggunaan saya seperti

    sed -i /s/testtobechanged/textwanted/g filename

    Gunakan man sedatau cari tutorial lain untuk penggunaan yang lebih kompleks.

Shihe Zhang
sumber
1

Anda dapat menggunakan catjika terpasang, dengan >caracter. Ini manipulasi:

cat > file_to_edit
#1 Write or Paste you text
#2 don't forget to leave a blank line at the end of file
#3 Ctrl + C to apply configuration

Sekarang Anda dapat melihat hasilnya dengan perintah

cat file
dero
sumber
0

Anda juga dapat menggunakan wadah khusus yang hanya akan berisi perintah yang Anda butuhkan: Vim. Saya memilih python-vim . Diasumsikan bahwa data yang ingin Anda edit berada dalam wadah data yang dibangun dengan Dockerfile berikut:

FROM debian:jessie
ENV MY_USER_PASS my_user_pass
RUN groupadd --gid 1001 my_user
RUN useradd -ms /bin/bash --home /home/my_user \
            -p $(echo "print crypt("${MY_USER_PASS:-password}", "salt")" | perl) \
            --uid 1001 --gid 1001 my_user
ADD src /home/my_user/src
RUN chown -R my_user:my_user /home/my_user/src
RUN chmod u+x /home/my_user/src
CMD ["true"]

Anda akan dapat mengedit data Anda dengan memasang volume Docker (src_volume) yang akan dibagikan oleh wadah data Anda (src_data) dan wadah python-vim.

docker volume create --name src_volume
docker build -t src_data .
docker run -d -v src_volume:/home/my_user/src --name src_data_1 src_data
docker run --rm -it -v src_volume:/src fedeg/python-vim:latest

Dengan begitu, Anda tidak mengubah wadah Anda. Anda cukup menggunakan wadah khusus untuk pekerjaan ini.

MaxiReglisse
sumber