Как мне отредактировать файл после оболочки в Docker-контейнер?
Я успешно обработал контейнер 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:/#
Как мне редактировать файлы?
25 ответов
Как и в комментариях, редактор по умолчанию не установлен - странно - $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 поставляются обрезанными до минимума - поэтому в поставляемом контейнере не установлен редактор. Вот почему необходимо установить его вручную.
Если вы не хотите добавлять редактор только для того, чтобы внести несколько небольших изменений (например, изменить конфигурацию Tomcat), вы можете просто использовать:
docker cp <container>:/path/to/file.ext .
который копирует его на ваш локальный компьютер (в ваш текущий каталог). Затем отредактируйте файл локально, используя ваш любимый редактор, а затем выполните
docker cp file.ext <container>:/path/to/file.ext
заменить старый файл.
Ты можешь использовать 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
Чтобы ваши изображения Docker были маленькими, не устанавливайте ненужные редакторы. Вы можете редактировать файлы через SSH с хоста Docker в контейнер:
vim scp://remoteuser@containerip//path/to/document
Вы можете использовать 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
Вы можете открыть существующий файл с помощью
cat filename.extension
и скопируйте весь существующий текст в буфер обмена.
Затем удалите старый файл с помощью
rm filename.extension
или переименуйте старый файл с
mv old-filename.extension new-filename.extension
Создать новый файл с
cat > new-file.extension
Затем вставьте весь текст, скопированный в буфер обмена, нажмите Enter
и выйдите с сохранением, нажав ctrl+z
. И вуаля не нужно устанавливать никаких редакторов.
Для обычных операций редактирования я предпочитаю установить vi
(vim-tiny), который использует только 1491 КБ илиnano
который использует 1707 КБ.
В другой руке vim
использует 28,9 МБ.
Мы должны помнить об этом, чтобы apt-get install
чтобы работать, мы должны сделать update
первый раз, так что:
apt-get update
apt-get install vim-tiny
Чтобы запустить редактор в CLI, нам нужно ввестиvi
.
Когда-нибудь вы должны сначала запустить контейнер с root
:
docker exec -ti --user root <container-id> /bin/bash
Затем в контейнере, чтобы установить Vim или что-то еще:
apt-get install vim
Я использую "Docker Run" (не "Docker Exec"), и я нахожусь в запретной зоне, где мы не можем установить редактор. Но у меня есть редактор на хосте Docker.
Мой обходной путь: подключите том с хоста Docker к контейнеру ( https://docs.docker.com/engine/reference/run/) и отредактируйте файл вне контейнера. Это выглядит так:
docker run -v /outside/dir:/container/dir
Это в основном для экспериментов, а позже я изменил файл при создании изображения.
После того, как вы отправились в контейнер Docker, просто наберите:
apt-get update
apt-get install nano
Вы можете просто отредактировать свой файл на хосте и быстро скопировать его в контейнер. Вот мой однострочный ярлык для копирования и запуска файла Python:
docker cp main.py my-container:/data/scripts/ ; docker exec -it my-container python /data/scripts/main.py
См. Вопрос о переполнении стека в месте редактирования файла
Было бы хорошим вариантом здесь, если:
- Чтобы изменить большой файл, невозможно использовать
cat
, Установка Vim запрещена или занимает слишком много времени. Моя ситуация использует образ MySQL 5.7, когда я хочу изменить
my.cnf
файла нетvim
,vi
и установка Vim занимает слишком много времени (China Great Firewall).sed
представлен на изображении, и это довольно просто. Мое использование какsed -i /s/testtobechanged/textwanted/g filename
использование
man sed
или посмотрите другие учебники для более сложного использования.
Если вы используете контейнер 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
Это немного странно, но в крайнем случае вы можете использовать sed
или же awk
сделать небольшие правки или удалить текст. Будьте осторожны с вашими регулярными выражениями, конечно, и помните, что вы, вероятно, root
на вашем контейнере и, возможно, придется заново настроить разрешения.
Например, удаление полной строки, содержащей текст, соответствующий регулярному выражению:
awk '!/targetText/' file.txt > temp && mv temp file.txt
Если вы можете использовать только оболочку в контейнере с помощью bin/ sh (в случае, если bin/ bash не работает), а apt или apt-get не работают в контейнере, проверьте, установлен ли apk, введя apk в командной строке внутри контейнера . Если да, вы можете установить nano следующим образом: apk добавить nano
тогда нано будет работать в обычном режиме
Простой способ отредактировать несколько строк:
echo "deb http://deb.debian.org/debian stretch main" > sources.list
Я использовал контейнер mysql:8.0 и обнаружил, что текстовый редактор не установлен. Пакетный менеджер тоже не был установлен??? К счастью, у меня был установлен VS Code с расширением Docker. С помощью расширения Docker вы можете просматривать все запущенные (и закрытые) контейнеры и детализировать файловую систему, как если бы это была локальная файловая система.
ХТХ!
Обязательно обновите контейнер, прежде чем пытаться установить редактор.
apt-get update
apt-get install nano vi
Вы также можете использовать специальный контейнер, который будет содержать только нужную вам команду: 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
Таким образом, вы не меняете свои контейнеры. Вы просто используете специальный контейнер для этой работы.
Я согласен с тем, что ответ @hkong следует принять, поскольку он позволяет избежать добавления дополнительных пакетов в контейнер. Однако я обнаружил, что после вставки измененного файла в контейнер некоторые из них, как правило, имели ограниченный доступ, так что демон docker не запускался. В этом случае назначьте измененному файлу какое-либо разрешение, а затем вставьте его в контейнер.
Вы можете просмотреть содержимое файла в работающем контейнере, ничего не устанавливая.
Способ 1: если вы используете vs-код, установите расширение докера. Затем, когда вы запустите контейнер, щелкните значок докера на левой боковой панели. Он показывает структуру каталогов работающего контейнера. вы можете перейти к своему каталогу из графического интерфейса и открыть содержимое файла.
Способ 2: если вы хотите сделать это с помощью командной строки, из PowerShell выполните команду
docker exec -it идентификатор контейнера sh
затем перейдите в свой каталог с помощью компакт-диска, где находится ваш файл.
затем используйте команду « more --lines 10 index.html » (или имя вашего файла)
это позволит просматривать 10 строк одновременно. нажатие Enter отобразит следующие 10 строк
Если вы ищете маленький, попробуйте нано-крошечный!
apt-get update
apt-get install nano-tiny
Кстати, образ Docker Postgres был создан с помощью linuxkit.
Для информации и сравнения... Мой контейнер сообщает:
# apt-cache show nano-tiny
Package: nano-tiny
Source: nano
Version: 7.2-1
Installed-Size: 187
Maintainer: Jordi Mallach <jordi@debian.org>
# apt-cache show vim-tiny
Package: vim-tiny
Source: vim
Version: 2:9.0.1378-2
Installed-Size: 1689
Maintainer: Debian Vim Maintainers <team+vim@tracker.debian.org>
Если вам не нужны функции редактора VI, возможно, эта версия nano подойдет вам.
Надеюсь, это поможет!
Первый вход в систему как root:docker run -u root -ti bashВведите следующие команды:apt-get update &&apt-get install nano
docker работает без редакторов. поэтому просто установите vim, 36 МБ места не убивают ваш докер!