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

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

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

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

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

тогда нано будет работать в обычном режиме

Вы можете установить нано

      yum install 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 МБ места не убивают ваш докер!

Другие вопросы по тегам