Docker kapsayıcısına kabuk ekledikten sonra dosyayı nasıl düzenlerim?


518

Başarıyla kullanarak bir Docker konteyner kabuklu:

docker exec -i -t 69f1711a205e bash

Şimdi dosyayı düzenlemem gerekiyor ve içinde herhangi bir editörüm yok:

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:/#

Dosyaları nasıl düzenlerim?


@Opal Ben confluent / postgres-bw kullanıyorum: 0.1
Igor Barinov

2
@Opal apt-get install vim çalışır. Teşekkürler!
Igor Barinov

3
neden Dockerfileapt-get install komutunu oluşturup kendi kabınızı oluşturmuyorsunuz? Docker konteyneri bu şekilde tasarlanmıştır, sizin tarzınız değil.
BMW

1
liman işçisi en azından varsayılan olarak vim test editörüne kiralamada yüklemelidir
Bawantha

Yanıtlar:


724

Yorumlarda olduğu gibi, $EDITORortam değişkeni boş olarak ayarlanmış varsayılan bir düzenleyici yoktur . Bir kapsayıcıya aşağıdakilerle giriş yapabilirsiniz:

docker exec -it <container> bash

Ve koş:

apt-get update
apt-get install vim

Veya aşağıdaki Docker dosyasını kullanın:

FROM  confluent/postgres-bw:0.1

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

Docker görüntüleri en azından kesilmiş olarak teslim edilir - bu nedenle gönderilen konteynere herhangi bir düzenleyici yüklenmez. Bu yüzden manuel olarak yüklemeye ihtiyaç vardır.

DÜZENLE

Ben de benim okuma teşvik yazı konu hakkında.


3
İhtiyacınız olan şey bir birim monte etmektir
Opal

16
Bunu yapabilmek için root olarak giriş yapmam gerekiyordu docker exec -u 0 -it container_name bash.
Müh.Fouad

34
Docker'da olduğu gibi vim-tiny, muhtemelen daha iyi kurulum .
ryenus

2
Belki de eklediğiniz her bir konteynere bir editör kurmayı değil, docker ana bilgisayarına sadece bir kez kurmayı düşünebilirsiniz. Diğer yorumculardan bahsedildiği gibi, birimi bağlayabilirsiniz, böylece bağlanacak dosyaları düzenleyebilir veya kapsayıcı verilerinin kendisine gidebilir ve dosyaları düzenleyebilirsiniz/var/lib/docker/
Pitt

4
Sadece bir yapılandırmayı konteynerde true'dan false'a değiştirmek istedim. apt-getkonteyner içindeki izin sorunu nedeniyle çalışma değildi, bu yüzden denedim sed -i 's/texttobechanged/textwanted/g' filename. Benim için çalıştı.
Amreesh Tyagi

420

Yalnızca birkaç küçük değişiklik yapmak için bir düzenleyici eklemek istemiyorsanız (ör. Tomcat yapılandırmasını değiştirmek), şunları kullanabilirsiniz:

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

yerel makinenize kopyalar (geçerli dizininize). Ardından, favori düzenleyicinizi kullanarak dosyayı yerel olarak düzenleyin ve ardından bir

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

eski dosyayı değiştirmek için.


21
@Igor Bu, kapınıza ek paketler eklemeden bunu yapmanın doğru yolu olduğu için, kabul edilen çözüm olmalıdır; paketler eklemek ise ikincil bir çözüm olmalıdır.
Routhinator

1
Windows platformları için aşağıdakileri kullanabilirsiniz: docker cp <container>:C:\inetpub\wwwroot\Web.config .ve docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares

1
Test amaçlı güzel bir çözüm! Üretimde yapmanızı önermiyorum.
Michal Šípek

9
Ve üretim için ne öneriyorsunuz? İnsanlar bir kaptaki dosyaları üretimde etkileşimli olarak mı düzenlemeli?
lucid_dreamer

4
Bu yönteme dikkat etmek, dosya sahipliğini değiştirir. Daha sonra kapsayıcıya root ( docker exec -u 0 -it mycontainer bash) olarak girip bir chownkomut çalıştırarak bunu değiştirmek biraz zor .
Steve Chambers

91

Yüklüyse kullanabilirsiniz cat, bu çıplak / ham bir kap değilse büyük olasılıkla olacaktır. Bir tutam olarak çalışır ve kopyala + yerel olarak uygun bir düzenleyiciye yapıştırırken tamam.

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

catsatır başına yeni satır alır. Son satır için yeni satır eklediğinizden emin olun. ctrl-c gönderirSIGINT kedinin incelikle çıkmasını sağlar. Dosya sonunu belirtmek için ctrl-d tuşlarına da basabileceğinizi görüyorsunuz ("artık giriş yok").

Başka bir seçenek, infilterkonteyner ad alanına bir ptrace sihri ile bir süreç enjekte etmek gibi bir şeydir : https://github.com/yadutaf/infilter


3
Damlatma izni sorunları varsa bu inanılmaz derecede faydalıdır!
Roman

17
ctrl+Ddaha iyidir ctrl+C. ctrl+Dgönderir EOF. Sonuna fazladan bir satır eklemenize gerek yoktur. İle ctrl+CEğer yeni satır eklemeyi unutmayın, eğer sen son satırı kaybedersiniz!
wisbucky

1
@wisbucky Güzel! Daha iyi. Gerçi iki kez ctrl-d gerekebilir.
meijsermans

52

Docker görüntülerinizi küçük tutmak için gereksiz düzenleyiciler kurmayın. SSH üzerinden dosyaları Docker ana bilgisayarından kapsayıcıya düzenleyebilirsiniz:

vim scp://remoteuser@containerip//path/to/document

2
Teşekkür ederim. vim scp:// Vim.wikia'yı daha iyi açıklayan bu bağlantıdan ayrılmak istedim . Ayrıca, sudo docker inspect <container_id> | grep "IPAddress"
kabınızın

1
Merak ediyorum, kelimenin tam anlamıyla "uzak kullanıcı" veya "liman işçisi" mi kullanıyorum? Denedim: vim scp://docker@172.17.0.17//data/gitea/conf/app.inihem de vim scp://remoteuser@172.17.0.17//data/gitea/conf/app.inihem de sadece yeni, boş bir dosya oluşturun.
J. Scott Elblein

1
@ J.ScottElblein Bunun için sshöncelikle docker konteynırınızda yapılandırma yapmanız gerekir . Bkz. Blog.softwaremill.com/… . Ancak genellikle sshkonteynırınıza kurulum yapmak istemezsiniz .
wisbucky

14

Bazen konteyneri aşağıdakilerle çalıştırmalısınız root:

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

Sonra kapta, Vim veya başka bir şey yüklemek için:

apt-get install vim

7

"Docker run" kullanıyorum ("docker exec" değil) ve bir editör yükleyemediğim sınırlı bir bölgedeyim. Ama Docker sunucusunda bir editörüm var.

Geçici çözüm: Docker ana bilgisayarından bir birimi bağlama (bağlama ) ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) ve dosyayı kapsayıcı dışında düzenleyin. Şöyle görünüyor:

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

Bu çoğunlukla deneme amaçlıdır ve daha sonra görüntüyü oluştururken dosyayı değiştirirdim.


6

Docker kapsayıcısına kabuk ekledikten sonra şunu yazın:

apt-get update
apt-get install nano

6

Mevcut dosyayı şu şekilde açabilirsiniz:

cat filename.extension

ve varolan tüm metni panoya kopyalayın.

Ardından ile eski dosyayı silin

rm filename.extension

veya eski dosyayı

mv old-filename.extension new-filename.extension

İle yeni dosya oluştur

cat > new-file.extension

Ardından panoya kopyalanan tüm metni yapıştırın, düğmesine basın Enterve düğmesine basarak kaydet ile çıkın ctrl+z. Ve herhangi bir editör kurmanıza gerek yok.


5

Dosyanızı ana bilgisayarda düzenleyebilir ve hızlı bir şekilde kopyalayıp kabın içinde çalıştırabilirsiniz. İşte bir Python dosyasını kopyalamak ve çalıştırmak için tek satırlık kısayol:

docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py

1
Bu soruya nasıl cevap veriyor? - "Dosyaları nasıl düzenlerim?"
Peter Mortensen

4

Genel düzenleme işlemleri için yalnızca 1491 kB veya 1707 kB kullanan vi( vim-tiny ) yüklemeyi tercih ederimnano .

Diğer yandan 28,9 MBvim kullanır .

apt-get installÇalışabilmek updateiçin ilk kez yapmamız gerektiğini hatırlamalıyız , bu yüzden:

apt-get update
apt-get install vim-tiny

Editöre CLI'de başlamak için girmemiz gerekiyor vi.


2

Windows kapsayıcısı kullanıyorsanız ve herhangi bir dosyayı değiştirmek istiyorsanız, Powershell konsolunda Vim'i kolayca alabilir ve kullanabilirsiniz.

PowerShell ile Windows Docker kapsayıcısına kabuk oluşturmak için:

docker exec -it <name> powershell

  • İlk olarak Chocolatey paket yöneticisini kurun

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

  • Vim'i yükle

    choco install vim

  • Yenile ÇEVRESEL DEĞİŞKEN Sadece exitkabın içine geri koyabilirsiniz

  • Dosya konumuna gidin ve Vim it vim file.txt


1

Bu tür garip olduğunu, ancak bir çimdik kullanabileceğiniz sedveya awkküçük düzenlemeler veya kaldır metnini yapmak. Regex hedeflerinize elbette dikkat edin rootve konteynerinizde büyük olasılıkla olduğunuzu ve izinleri yeniden ayarlamanız gerekebileceğini unutmayın.

Örneğin, normal ifadeyle eşleşen metin içeren tam bir satırı kaldırma:

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

(Daha)


1

Birkaç satırı düzenlemenin kolay bir yolu:

echo "deb http://deb.debian.org/debian stretch main" > sources.list

1

Yığın Taşması soru sed dosyasını düzenleme yerinde görün

Burada iyi bir seçenek olurdu, eğer:

  1. Büyük bir dosyayı değiştirmek için kullanılması imkansızdır cat.
  2. Install Vim'e izin verilmiyor veya çok uzun sürüyor. Dosyamı değiştirmek istediğimde durumum MySQL 5.7 görüntüsünü kullanıyor my.cnf, hayır vim, viVim yüklemesi çok uzun sürüyor (Çin Büyük Güvenlik Duvarı). sedresimde sağlanmıştır ve oldukça basittir. Benim kullanımım

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

    man sedDaha karmaşık kullanım için diğer öğreticileri kullanın veya arayın.


1

catTakılıysa, >caracter ile kullanabilirsiniz . İşte manipülasyon:

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

Şimdi sonucu şu komutla görebilirsiniz:

cat file

0

Ayrıca yalnızca ihtiyacınız olan komutu içeren özel bir kap da kullanabilirsiniz: Vim. Python-vim'i seçtim . Düzenlemek istediğiniz verilerin aşağıdaki Dockerfile ile oluşturulmuş bir veri kapsayıcısında olduğunu varsayar:

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"]

Veri konteyneriniz (src_data) ve python-vim konteyneri tarafından paylaşılacak bir Docker birimi (src_volume) takarak verilerinizi düzenleyebilirsiniz.

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

Bu şekilde kaplarınızı değiştirmezsiniz. Bu iş için sadece özel bir kap kullanıyorsunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.