it-roy-ru.com

Как мне отредактировать файл после Shell в контейнере Docker?

Я успешно обработал контейнер Docker с помощью

docker exec -i -t 69f1711a205e bash

Теперь мне нужно отредактировать файл, и у меня нет редакторов внутри:

[email protected]:/# nano
bash: nano: command not found
[email protected]:/# pico
bash: pico: command not found
[email protected]:/# vi
bash: vi: command not found
[email protected]:/# vim
bash: vim: command not found
[email protected]:/# emacs
bash: emacs: command not found
[email protected]:/#

Как мне редактировать файлы?

364
Igor Barinov

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

ПРАВКА

Я также призываю вас прочитать мой пост о теме.

534
Opal

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

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

который копирует его на ваш локальный компьютер (в ваш текущий каталог). Затем отредактируйте файл локально, используя ваш любимый редактор, а затем выполните

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

заменить старый файл.

307
hkong

Вы можете использовать cat, если он установлен, что, скорее всего, будет иметь место, если это не пустой контейнер. Это работает в крайнем случае, и хорошо, когда копирование + вставка в соответствующий редактор локально.

cat > file
# 1. type in your content
# 2. leave a newline at end of file
# 3. ctrl-c
cat file

cat будет выводить каждую строку при получении новой строки. Не забудьте добавить новую строку для этой последней строки. ctrl-c отправляет SIGINT для кота, чтобы выйти изящно.

Другой вариант - что-то вроде infilter, который внедряет процесс в пространство имен контейнера с помощью некоторой магии ptrace: https://github.com/yadutaf/infilter

59
meijsermans

Чтобы ваши изображения Docker были маленькими, не устанавливайте ненужные редакторы. Вы можете редактировать файлы через SSH с Docker Host в контейнер:

vim scp://[email protected]//path/to/document
43
Matthew

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

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

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

apt-get install vim
10
yan

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

Мой обходной путь: подключите том с Docker Host к контейнеру ( https://docs.docker.com/engine/reference/run/#/volume-shared-filesystems ) и отредактируйте файл снаружи контейнер. Это выглядит так:

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

Это в основном для экспериментов, а позже я изменил файл при создании изображения.

6
ynux

Вы можете просто отредактировать свой файл на хосте, быстро скопировать и запустить его внутри контейнера. Вот мой однострочный ярлык для копирования и запуска файла Python:

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

После того, как вы отправились в контейнер Docker, просто наберите:

apt-get update
apt-get install nano
2
Dos

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

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

  1. Чтобы изменить большой файл, невозможно использовать cat.
  2. Установка Vim не разрешена или занимает слишком много времени В моей ситуации используется образ MySQL 5.7, когда я хочу изменить файл my.cnf, нет vim, vi, а установка Vim занимает слишком много времени (China Great Firewall). sed представлен на изображении, и это довольно просто. Мое использование как

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

    Используйте man sed или найдите другие учебники для более сложного использования.

1
Shihe Zhang

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

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

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

(Больше)

1
bbeecher

Простой способ отредактировать несколько строк:

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

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

Таким образом, вы не меняете свои контейнеры. Вы просто используете специальный контейнер для этой работы.

0
MaxiReglisse

Если вы используете контейнер 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 и Shell обратно в контейнер

  • Перейти к расположению файла и Vim это vim file.txt

0
Aidar Gatin