Як відредагувати файл після завантаження в контейнер Docker?


518

Я успішно обстрілявся в контейнер 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 Я використовую confluent / postgres-bw: 0.1
Ігор Баринов

2
@Opal apt-get install vim працює. Дякую!
Ігор Баринов

3
так чому б не створити команду Dockerfileapt-get install та не створити власний контейнер? Контейнер Docker розроблений таким чином, а не ваш шлях.
BMW

1
Докер повинен встановити в оренду на тестовому редакторі, принаймні vim за замовчуванням
Bawantha

Відповіді:


723

Як і в коментарях, не існує набору редакторів за замовчуванням - дивно - $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 доставляються обрізаними до мінімуму - тому жоден редактор не встановлений з поставленим контейнером. Ось чому є необхідність встановити його вручну.

EDIT

Я також рекомендую вам прочитати мій пост про цю тему.


3
Вам потрібно встановити об'єм: docs.docker.com/userguide/dockervolumes
Опал

16
Мені потрібно було увійти як корінь, щоб це зробити docker exec -u 0 -it container_name bash.
Eng.Fouad

34
Як і у випадку з docker, краще встановити vim-tinyзамість цього, напевно.
ryenus

2
Можливо, ви могли б розглянути можливість встановлення редактора у кожному контейнері, до якого ви додаєте, а лише один раз на хост-машині докера. Як згадували інші коментатори, ви можете встановити гучність, щоб ви могли редагувати файли, які збираєтеся встановити, або переходити до самих даних контейнера та редагувати файли в/var/lib/docker/
Пітт

4
Я просто хотів змінити одну конфігурацію з істинної на помилкову в контейнері. apt-getне працює через видачу дозволу всередині контейнера, тому я спробував sed -i 's/texttobechanged/textwanted/g' filename. Це працювало для мене.
Amreesh Tiagi

420

Якщо ви не хочете додавати редактор, щоб внести кілька невеликих змін (наприклад, змінити конфігурацію Tomcat), ви можете просто скористатися:

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

який копіює його на вашу локальну машину (у ваш поточний каталог). Потім відредагуйте файл локально за допомогою улюбленого редактора, а потім зробіть

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

замінити старий файл.


21
@Igor Це фактично повинно бути прийнятим рішенням, оскільки це правильний спосіб зробити це без додавання додаткових пакетів до контейнера, тоді як додавання пакунків має бути вторинним рішенням.
Ротатор

1
Для платформ Windows можна використовувати, наприклад: docker cp <container>:C:\inetpub\wwwroot\Web.config .і docker cp Web.config <container>:C:\inetpub\wwwroot\Web.config.
Rosberg Linhares

1
Приємного вирішення для тестування! Я не рекомендую робити це у виробництві.
Міхал Шіпек

9
А що ви рекомендуєте для виробництва? Чи повинні люди редагувати файли в контейнері інтерактивно у виробництві?
lucid_dreamer

4
Варто зазначити, що цей метод змінює право власності на файл. Можна, але трохи нахабно, змінити його назад, перейшовши в контейнер як root ( docker exec -u 0 -it mycontainer bash), а потім виконавши chownкоманду.
Стів Чемберс

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+Dкраще, ніж ctrl+C. ctrl+Dнадсилає EOF. Не потрібно додавати додатковий новий рядок наприкінці. З ctrl+C, якщо ви забули додати символ нового рядка, то ви втратите останній рядок!
wisbucky

1
@wisbucky Приємно! Навіть краще. Можливо, потрібно ctrl-d двічі.
meijsermans

52

Щоб ваші зображення Docker були маленькими, не встановлюйте зайві редактори. Ви можете редагувати файли через SSH від хокера Docker до контейнера:

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

2
Дякую. Я хотів залишити це посилання, яке краще пояснює vim scp:// vim.wikia . Також, щоб отримати IP-адресу вашого контейнера, ви можете використовуватиsudo docker inspect <container_id> | grep "IPAddress"
aJetHorn

1
Цікаво, чи я буквально використовую "дистанційний користувач" чи "докер"? Я спробував: vim scp://docker@172.17.0.17//data/gitea/conf/app.iniяк vim scp://remoteuser@172.17.0.17//data/gitea/conf/app.iniі обидва вони просто створюють новий, порожній файл.
Дж. Скотт Елблін

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 run" (не "docker exec"), і я перебуваю в обмеженій зоні, де ми не можемо встановити редактор. Але у мене є редактор на хості Докер.

Моє вирішення полягає в тому, щоб: прив’язати том з хокера Docker до контейнера ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) та відредагувати файл поза контейнером. Це виглядає приблизно так:

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

Це здебільшого для експериментів, і пізніше я міняв би файл, коли будував зображення.


6

Після того, як ви обстріляли контейнер Docker, просто введіть:

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. І вуаля немає необхідності встановлювати будь-які редактори.


5

Ви можете просто відредагувати свій файл на хості та швидко скопіювати його та запустити всередині контейнера. Ось мій однорядний ярлик для копіювання та запуску файлу Python:

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

1
Як це відповідає на питання? - "Як редагувати файли?"
Пітер Мортенсен

4

Для звичайних операцій редагування я вважаю за краще встановити vi( vim-tiny ), який використовує лише 1491 кБ або nanoвикористовує 1707 кБ .

З іншого боку, vimвикористовується 28,9 Мб .

Ми маємо пам’ятати, що для того, apt-get installщоб працювати, ми повинні робити updateперший раз, так:

apt-get update
apt-get install vim-tiny

Для запуску редактора в CLI нам потрібно ввести vi.


2

Якщо ви використовуєте контейнер Windows і хочете змінити будь-який файл, ви можете легко та легко отримати Vim в консолі Powershell.

Щоб обстріляти контейнер 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вносити невеликі зміни або видаляти текст. Будьте обережні, звичайно, зі своїми цілями регулярних виразів та пам'ятайте, що ви, ймовірно, перебуваєте rootу вашому контейнері та, можливо, доведеться повторно коригувати дозволи.

Наприклад, видалення повного рядка, що містить текст, що відповідає регексу:

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

(Більше)



1

Див. На місці запитання про редагування файлу Stack Overflow

Тут було б хорошим варіантом, якщо:

  1. Щоб змінити великий файл, використовувати його неможливо cat.
  2. Встановлення Vim заборонено або займає занадто багато часу. МОЯ ситуація з використанням MySQL 5.7 зображення , коли я хочу , щоб змінити my.cnfфайл, не існує vim, viі єт установку займає надто багато часу (Китай Great 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

Ви також можете використовувати спеціальний контейнер, який буде містити лише потрібну вам команду: Vim. Я вибрав python-vim . Передбачається, що дані, які ви хочете відредагувати, знаходяться у контейнері даних, побудованому із таким 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"]

Ви зможете редагувати свої дані, встановивши ток Docker (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

Таким чином, ви не змінюєте контейнери. Ви просто використовуєте для цієї роботи спеціальний контейнер.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.