ฉันจะแก้ไขไฟล์หลังจากเปลือกไปยังคอนเทนเนอร์ Docker ได้อย่างไร


518

ฉันได้ทำการ shelled ไปยังคอนเทนเนอร์ Docker สำเร็จแล้วโดยใช้:

docker exec -i -t 69f1711a205e bash

ตอนนี้ฉันต้องการแก้ไขไฟล์และฉันไม่มีบรรณาธิการอยู่:

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

ฉันจะแก้ไขไฟล์ได้อย่างไร


@Opal ฉันใช้ไหลมารวมกัน / postgres-bw: 0.1
Igor Barinov

2
@Opal apt-get vim ติดตั้งใช้งานได้ ขอบคุณ!
Igor Barinov

3
ดังนั้นทำไมไม่สร้างDockerfileและรวมถึง apt-get install คำสั่งและสร้างภาชนะของคุณเอง? คอนเทนเนอร์นักเทียบท่าได้รับการออกแบบเช่นนี้ไม่ใช่วิธีของคุณ
BMW

1
นักเทียบท่าควรติดตั้งอย่างน้อยในการแก้ไขการทดสอบที่เป็นกลุ่มน้อยโดยค่าเริ่มต้น
Bawantha

คำตอบ:


724

ในความคิดเห็นไม่มีชุดเครื่องมือแก้ไขเริ่มต้น - แปลก - $EDITORตัวแปรสภาพแวดล้อมว่างเปล่า คุณสามารถเข้าสู่คอนเทนเนอร์ด้วย:

docker exec -it <container> bash

และเรียกใช้:

apt-get update
apt-get install vim

หรือใช้ Dockerfile ต่อไปนี้:

FROM  confluent/postgres-bw:0.1

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

อิมเมจของ Docker จะถูกตัดให้เหลือน้อยที่สุด - ดังนั้นจึงไม่มีการติดตั้งเอดิเตอร์ใด ๆ นั่นเป็นเหตุผลที่ไม่จำเป็นต้องติดตั้งด้วยตนเอง

แก้ไข

ฉันขอแนะนำให้คุณอ่านโพสต์ของฉันเกี่ยวกับหัวข้อ


3
สิ่งที่คุณต้องการคือการติดตั้งไดรฟ์ข้อมูล: docs.docker.com/userguide/dockervolumes
Opal

16
ฉันต้องเข้าสู่ระบบในฐานะที่เป็นรูทเพื่อทำสิ่งdocker exec -u 0 -it container_name bashนี้
Eng.Fouad

34
เช่นเดียวกับนักเทียบท่าควรติดตั้งvim-tinyแทนดีกว่า
ryenus

2
บางทีคุณอาจพิจารณาไม่ติดตั้งตัวแก้ไขในแต่ละคอนเทนเนอร์ที่คุณแนบ แต่เพียงครั้งเดียวบนเครื่องโฮสต์ของนักเทียบท่า ในขณะที่นักวิจารณ์คนอื่นพูดถึงคุณสามารถเมานไดรฟ์เพื่อให้คุณสามารถแก้ไขไฟล์ที่กำลังจะถูกเมานต์หรือนำทางไปยังข้อมูลคอนเทนเนอร์เองและแก้ไขไฟล์ใน/var/lib/docker/
Pitt

4
ฉันแค่ต้องการเปลี่ยนการกำหนดค่าหนึ่งจากจริงเป็นเท็จในภาชนะ ไม่ได้ทำงานเนื่องจากภาชนะภายในปัญหาได้รับอนุญาตดังนั้นฉันพยายามapt-get sed -i 's/texttobechanged/textwanted/g' filenameมันใช้งานได้สำหรับฉัน
Amreesh Tyagi

420

หากคุณไม่ต้องการเพิ่มเครื่องมือแก้ไขเพียงแค่ทำการเปลี่ยนแปลงเล็กน้อย (เช่นเปลี่ยนการกำหนดค่า Tomcat) คุณสามารถใช้:

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

ซึ่งคัดลอกไปยังเครื่องท้องถิ่นของคุณ (ไปยังไดเรกทอรีปัจจุบันของคุณ) จากนั้นแก้ไขไฟล์ในเครื่องโดยใช้โปรแกรมแก้ไขที่คุณชื่นชอบแล้วทำตาม

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

เพื่อแทนที่ไฟล์เก่า


21
@Igor สิ่งนี้ควรเป็นโซลูชันที่ได้รับการยอมรับอย่างแท้จริงเนื่องจากเป็นวิธีที่เหมาะสมในการทำโดยไม่ต้องเพิ่มแพ็คเกจเพิ่มเติมลงในคอนเทนเนอร์ของคุณในขณะที่การเพิ่มแพ็คเกจควรเป็นโซลูชันสำรอง
Routhinator

1
สำหรับแพลตฟอร์ม Windows คุณสามารถใช้ตัวอย่างเช่น: และdocker cp <container>:C:\inetpub\wwwroot\Web.config . docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config
Rosberg Linhares

1
วิธีแก้ปัญหาที่ดีสำหรับวัตถุประสงค์ในการทดสอบ! ฉันไม่แนะนำให้ทำในการผลิต
Michal Šípek

9
และคุณแนะนำให้ผลิตอะไร ผู้คนควรแก้ไขไฟล์ในคอนเทนเนอร์แบบโต้ตอบในการผลิตหรือไม่?
lucid_dreamer

4
น่าสังเกตว่าวิธีนี้เปลี่ยนความเป็นเจ้าของไฟล์ มีความเป็นไปได้ แต่เพียงเล็กน้อยที่จะเปลี่ยนมันในภายหลังโดยเข้าไปที่คอนเทนเนอร์ในฐานะ root ( docker exec -u 0 -it mycontainer bash) จากนั้นจึงรันchownคำสั่ง
Steve Chambers

91

คุณสามารถใช้catถ้ามันติดตั้งซึ่งส่วนใหญ่จะเป็นกรณีถ้ามันไม่ได้เป็นภาชนะเปล่า / ดิบ มันใช้งานได้ดีและตกลงเมื่อคัดลอก + วางไปยังเครื่องมือแก้ไขที่เหมาะสมในพื้นที่

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

catจะส่งออกแต่ละบรรทัดเมื่อได้รับการขึ้นบรรทัดใหม่ ตรวจสอบให้แน่ใจว่าได้เพิ่มบรรทัดใหม่สำหรับบรรทัดสุดท้ายนั้น ctrl-c ส่งSIGINTแมวออกอย่างสง่างาม จากความคิดเห็นที่คุณเห็นว่าคุณสามารถกด ctrl-d เพื่อแสดงถึงจุดสิ้นสุดไฟล์ ("ไม่มีการป้อนข้อมูลเข้ามาอีก")

ตัวเลือกอื่นคือสิ่งinfilterที่จะแทรกกระบวนการลงในเนมสเปซคอนเทนเนอร์ด้วยเวทมนตร์ ptrace: https://github.com/yadutaf/infilter


3
มันมีประโยชน์อย่างเหลือเชื่อหากมีปัญหาการอนุญาตให้หยอด!
โรมัน

17
ctrl+Dctrl+Cจะดีกว่า ส่งctrl+D EOFคุณไม่จำเป็นต้องเพิ่มบรรทัดใหม่ในตอนท้าย ด้วยctrl+Cถ้าคุณลืมที่จะเพิ่มบรรทัดใหม่คุณจะสูญเสียบรรทัดสุดท้าย!
wisbucky

1
@wuckyucky ดี! ดียิ่งขึ้น อาจต้อง ctrl-d สองครั้ง
meijsermans

52

เพื่อให้ภาพ Docker ของคุณเล็กอย่าติดตั้งโปรแกรมแก้ไขที่ไม่จำเป็น คุณสามารถแก้ไขไฟล์ผ่าน SSH จากโฮสต์ Docker ไปยังคอนเทนเนอร์:

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

2
ขอบคุณ. ฉันต้องการที่จะออกจากการเชื่อมโยงนี้ซึ่งดีกว่าที่จะอธิบายvim.wikiavim scp:// นอกจากนี้ในการรับที่อยู่ IP ของคอนเทนเนอร์คุณสามารถใช้sudo docker inspect <container_id> | grep "IPAddress"
aJetHorn

1
แค่สงสัยฉันจะใช้ "remoteuser" หรือ "นักเทียบท่า" อย่างแท้จริงหรือไม่ ฉันได้พยายาม: vim scp://docker@172.17.0.17//data/gitea/conf/app.iniเช่นเดียวกับvim scp://remoteuser@172.17.0.17//data/gitea/conf/app.iniและทั้งสองของพวกเขาเพียงแค่สร้างใหม่ไฟล์ว่างเปล่า
J. Scott Elblein

1
@ J.ScottElblein สิ่งนี้ต้องการการกำหนดค่าsshบนคอนเทนเนอร์นักเทียบท่าของคุณก่อน ดูblog.softwaremill.com/… . แต่โดยทั่วไปคุณไม่ต้องการติดตั้งsshในคอนเทนเนอร์ของคุณ
wisbucky

14

บางครั้งคุณต้องเรียกใช้คอนเทนเนอร์ด้วยroot:

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

จากนั้นในคอนเทนเนอร์เพื่อติดตั้ง Vim หรืออย่างอื่น:

apt-get install vim

7

ฉันใช้ "นักเทียบท่าเรียกใช้" (ไม่ใช่ "นักเทียบท่าบริหาร") และฉันอยู่ในเขตหวงห้ามที่เราไม่สามารถติดตั้งโปรแกรมแก้ไขได้ แต่ฉันมีตัวแก้ไขบนโฮสต์ Docker

วิธีแก้ปัญหาของฉันคือ: ผูกติดตั้งไดรฟ์จากโฮสต์ Docker ไปยังคอนเทนเนอร์ ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) และแก้ไขไฟล์นอกคอนเทนเนอร์ ดูเหมือนว่านี้:

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

นี่เป็นส่วนใหญ่สำหรับการทดลองและหลังจากนั้นฉันจะเปลี่ยนไฟล์เมื่อสร้างภาพ


6

หลังจากคุณ shelled ไปที่ Docker container เพียงแค่พิมพ์:

apt-get update
apt-get install nano

6

คุณสามารถเปิดไฟล์ที่มีอยู่ด้วย

cat filename.extension

และคัดลอกข้อความที่มีอยู่ทั้งหมดบนคลิปบอร์ด

จากนั้นลบไฟล์เก่าด้วย

rm filename.extension

หรือเปลี่ยนชื่อไฟล์เก่าด้วย

mv old-filename.extension new-filename.extension

สร้างไฟล์ใหม่ด้วย

cat > new-file.extension

แล้ววางข้อความที่คัดลอกบนคลิปบอร์ดกดและออกที่มีการบันทึกโดยการกดEnter ctrl+zและ voila ไม่จำเป็นต้องติดตั้งโปรแกรมแก้ไขใด ๆ


5

คุณสามารถแก้ไขไฟล์ของคุณบนโฮสต์และคัดลอกลงในและเรียกใช้ภายในคอนเทนเนอร์ นี่คือทางลัดหนึ่งบรรทัดของฉันเพื่อคัดลอกและเรียกใช้ไฟล์ Python:

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

1
นั่นตอบคำถามได้อย่างไร - "ฉันจะแก้ไขไฟล์ได้อย่างไร"
Peter Mortensen

4

สำหรับการดำเนินการแก้ไขร่วมกันฉันชอบที่จะติดตั้งvi( เป็นกลุ่มเล็ก ๆ ) ซึ่งใช้เพียง1,491 กิโลไบต์หรือnanoที่ใช้1,707 กิโลไบต์

ในมืออื่น ๆ ที่vimใช้28.9 MB

เราต้องจำไว้ว่าในการที่apt-get installจะทำงานเราต้องทำupdateในครั้งแรกดังนั้น:

apt-get update
apt-get install vim-tiny

การเริ่มต้นการแก้ไขในCLIviเราต้องป้อน


2

หากคุณใช้ Windows container และคุณต้องการเปลี่ยนไฟล์ใด ๆ คุณสามารถรับและใช้ Vim ใน Powershell console ได้อย่างง่ายดาย

ในการปอกเปลือกคอนเทนเนอร์ Windows Docker ด้วย PowerShell:

docker exec -it <name> powershell

  • ก่อนติดตั้งตัวจัดการแพคเกจ Chocolatey

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

  • ติดตั้ง Vim

    choco install vim

  • รีเฟรชตัวแปรสภาพแวดล้อมคุณสามารถexitและเปลือกกลับไปที่ภาชนะ

  • ไปที่ตำแหน่งไฟล์และเป็นกลุ่ม vim file.txt


1

มันเป็นเรื่องน่าขัน แต่ในเวลาสั้น ๆ คุณสามารถใช้sedหรือawkแก้ไขเล็ก ๆ น้อย ๆ หรือลบข้อความ ระวังด้วยเป้าหมายที่แน่นอนของ regex ของคุณและระวังว่าคุณมีโอกาสที่จะซื้อrootคอนเทนเนอร์ของคุณและอาจต้องปรับสิทธิ์อีกครั้ง

ตัวอย่างเช่นการลบบรรทัดเต็มที่มีข้อความที่ตรงกับ regex:

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

(มากกว่า)



1

ดูไฟล์แก้ไขคำถามซ้อน ทับในสถานที่

มันจะเป็นตัวเลือกที่ดีที่นี่ถ้า:

  1. catหากต้องการแก้ไขไฟล์ขนาดใหญ่ก็เป็นไปไม่ได้ที่จะใช้
  2. ไม่อนุญาตให้ติดตั้งเป็นกลุ่มหรือใช้เวลานานเกินไป สถานการณ์ของฉันคือการใช้ MySQL 5.7 ภาพเมื่อฉันต้องการที่จะเปลี่ยนmy.cnfไฟล์ไม่มีvim, viและกลุ่มติดตั้งใช้เวลานานเกินไป (จีนที่ดี Firewall) sedมีให้ในภาพและมันค่อนข้างง่าย การใช้งานของฉันเป็นเหมือน

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

    ใช้ man sedหรือมองหาบทช่วยสอนอื่น ๆ สำหรับการใช้งานที่ซับซ้อนมากขึ้น


1

คุณสามารถใช้catถ้าติดตั้งกับ>caracter นี่คือการจัดการ:

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

ตอนนี้คุณสามารถเห็นผลลัพธ์ได้ด้วยคำสั่ง

cat file

0

นอกจากนี้คุณยังสามารถใช้คอนเทนเนอร์พิเศษซึ่งจะมีเฉพาะคำสั่งที่คุณต้องการ: เป็นกลุ่ม ผมเลือกหลามเป็นกลุ่ม ถือว่าข้อมูลที่คุณต้องการแก้ไขอยู่ใน data container ที่สร้างด้วย Dockerfile ต่อไปนี้:

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

คุณจะสามารถแก้ไขข้อมูลของคุณได้โดยการติดตั้งวอลุ่มนักเทียบท่า (src_volume) ซึ่งจะถูกแชร์โดยที่เก็บข้อมูลของคุณ (src_data) และคอนเทนเนอร์ 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

ด้วยวิธีนี้คุณจะไม่เปลี่ยนคอนเทนเนอร์ของคุณ คุณเพียงใช้คอนเทนเนอร์พิเศษสำหรับงานนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.