Как мне отредактировать файл после оболочки в 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
См. Вопрос о переполнении стека в месте редактирования файла
Было бы хорошим вариантом здесь, если:
- Чтобы изменить большой файл, невозможно использовать
cat
. -
Установка 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
.