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

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

Ответ 1

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

РЕДАКТИРОВАТЬ

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

Ответ 2

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

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

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

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

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

Ответ 3

Вы можете использовать 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

Ответ 4

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

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

Ответ 5

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

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

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

apt-get install vim

Ответ 6

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

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

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

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

Ответ 7

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

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

Ответ 8

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

apt-get update
apt-get install nano

Ответ 9

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

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

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

(Больше)

Ответ 10

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

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

Ответ 11

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

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

  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 или ищите другие учебники для более сложного использования.

Ответ 12

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

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

Ответ 13

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

Ответ 14

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

В другой руке vim использует 28,9 МБ.

Мы должны помнить, что для того, чтобы apt-get install заработал, мы должны выполнить update в первый раз, поэтому:

apt-get update
apt-get install vim-tiny

Чтобы запустить редактор в CLI, нам нужно ввести vi.