Как мне отредактировать файл после оболочки в 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

Ответы:


727

Как и в комментариях, редактор по умолчанию не установлен - странно - $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
Опал

16
Мне нужно было войти в систему как root, чтобы сделать это docker exec -u 0 -it container_name bash.
Eng.Fouad

34
Как и в случае с докером, лучше установить vim-tinyвместо этого, вероятно.
ryenus

2
Возможно, вы могли бы подумать не об установке редактора в каждом контейнере, к которому вы прикрепляете, а только один раз на хост-машине докера. Как упоминали другие комментаторы, вы можете смонтировать том, так что вы можете редактировать файлы, которые будут монтироваться, или переходить к самим данным контейнера и редактировать файлы в/var/lib/docker/
Pitt

4
Я просто хотел изменить одну конфигурацию с true на false в контейнере. apt-getне работал из-за проблемы с разрешением внутри контейнера, поэтому я попытался sed -i 's/texttobechanged/textwanted/g' filename. Это сработало для меня.
Амриеш Тяги,

422

Если вы не хотите добавлять редактор только для того, чтобы внести несколько небольших изменений (например, изменить конфигурацию 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.
Росберг Линхарес

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, если вы забудете добавить новую строку, вы потеряете последнюю строку!
Висбуки

1
@ wisbucky Отлично! Даже лучше. Возможно, нужно дважды нажать Ctrl-D.
Мейсерманс

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
Просто интересно, я буквально использую «remoteuser» или «docker»? Я пробовал: 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в свой контейнер.
Висбуки

14

Когда-нибудь вы должны сначала запустить контейнер с root:

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

Затем в контейнере, чтобы установить Vim или что-то еще:

apt-get install vim

7

Я использую «Docker Run» (не «Docker Exec»), и я нахожусь в запретной зоне, где мы не можем установить редактор. Но у меня есть редактор на хосте Docker.

Мой обходной путь: подключите том с хоста 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( ВИМ-крошечное ), который использует только 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 его vim file.txt


1

Это немного странно, но в крайнем случае вы можете использовать sedили awkсделать небольшие правки или удалить текст. Конечно, будьте осторожны с вашими регулярными выражениями и помните, что вы, скорее всего, находитесь rootв своем контейнере и, возможно, придется изменить настройки разрешений.

Например, удаление полной строки, содержащей текст, соответствующий регулярному выражению:

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

(Больше)



1

См. Вопрос о переполнении стека в месте редактирования файла

Было бы хорошим вариантом здесь, если:

  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если установлен, с >символом. Вот манипуляция:

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.