Docker изменить файл в контейнере
Теперь мне нужно отредактировать файл, а внутри у меня нет редакторов:
Как редактировать файлы?
Как и в комментариях, нет набора редакторов по умолчанию - странно - переменная среды $EDITOR пуста. Вы можете войти в контейнер с помощью:
Или используйте следующий Dockerfile:
Образы Docker доставляются обрезанными до минимума, поэтому редактор не устанавливается с поставляемым контейнером. Поэтому его необходимо устанавливать вручную.
ИЗМЕНИТЬ
Вы также можете использовать специальный контейнер, который будет содержать только нужную вам команду: Vim. Я выбрал python-vim. Предполагается, что данные, которые вы хотите редактировать, находятся в контейнере данных, созданном с помощью следующего файла Dockerfile:
Вы сможете редактировать свои данные, подключив том Docker (src_volume), который будет использоваться вашим контейнером данных (src_data) и контейнером python-vim.
Таким образом, вы не меняете свои контейнеры. Просто используйте для этой работы специальный контейнер.
Здесь будет хороший вариант, если:
-
Чтобы изменить большой файл, невозможно использовать cat .
Установка Vim запрещена или занимает слишком много времени. В моей ситуации используется образ MySQL 5.7, когда я хочу изменить файл my.cnf , нет vim , vi , а установка Vim занимает слишком много времени (China Great Firewall). sed представлен на изображении, и это довольно просто. Мое использование похоже
sed -i /s/testtobechanged/textwanted/g filename
Используйте man sed или найдите другие руководства для более сложного использования.
Простой способ отредактировать несколько строк:
Это довольно странно, но в крайнем случае вы можете использовать sed или awk для внесения небольших изменений или удаления текста. Разумеется, будьте осторожны с целевыми выражениями регулярных выражений и имейте в виду, что вы, вероятно, root в своем контейнере и, возможно, вам придется повторно настроить разрешения.
Например, удаление полной строки, содержащей текст, соответствующий регулярному выражению:
Если вы используете контейнер Windows и хотите изменить какой-либо файл, вы можете легко получить и использовать Vim в консоли Powershell.
Чтобы поместить в контейнер Windows Docker с помощью PowerShell:
docker exec -it powershell
Сначала установите менеджер пакетов Chocolatey
choco install vim
Обновить ЭКОЛОГИЧЕСКУЮ ПЕРЕМЕННУЮ Вы можете просто exit и вернуться к контейнеру.
Перейдите в папку с файлом и Vim его vim file.txt
Вы можете открыть существующий файл с помощью
И скопируйте весь существующий текст в буфер обмена.
Затем удалите старый файл с помощью
Или переименуйте старый файл с
Создать новый файл с
Затем вставьте весь текст, скопированный в буфер обмена, нажмите Enter и выйдите с сохранением, нажав ctrl+z . И вуаля не нужно устанавливать никаких редакторов.
Вы можете использовать cat , если он установлен, с символом > . Вот такая манипуляция:
Теперь вы можете увидеть результат с помощью команды
Я использую docker run (не docker exec), и я нахожусь в зоне ограниченного доступа, где мы не можем установить редактор. Но у меня есть редактор на хосте Docker.
Это в основном для экспериментов, позже я изменил файл при создании изображения.
Для обычных операций редактирования я предпочитаю установить vi ( vim-tiny ), который использует только 1491 кБ или nano , который использует 1707 КБ .
С другой стороны, vim использует 28,9 МБ .
Мы должны помнить, что для того, чтобы apt-get install работал, мы должны выполнить update в первый раз, поэтому:
Чтобы запустить редактор в CLI , нам нужно ввести vi .
Иногда вам нужно сначала запустить контейнер с root :
Затем в контейнере для установки Vim или чего-то еще:
Чтобы ваши образы Docker были небольшими, не устанавливайте ненужные редакторы. Вы можете редактировать файлы через SSH с хоста Docker в контейнер:
Вы можете использовать cat , если он установлен, что, скорее всего, будет иметь место, если это не пустой / необработанный контейнер. Он работает в крайнем случае, и нормально при копировании + вставке в соответствующий редактор локально.
cat будет выводить каждую строку при получении новой строки. Обязательно добавьте новую строку для этой последней строки. ctrl-c отправляет SIGINT для корректного завершения работы cat. Из комментариев вы видите, что вы также можете нажать ctrl-d для обозначения конца файла («больше не поступает ввод»).
Если вы не хотите добавлять редактор только для того, чтобы внести несколько небольших изменений (например, изменить конфигурацию Tomcat), вы можете просто использовать:
Который копирует его на ваш локальный компьютер (в ваш текущий каталог). Затем отредактируйте файл локально с помощью вашего любимого редактора, а затем выполните
Заменить старый файл.
Вы можете просто отредактировать свой файл на хосте, быстро скопировать его и запустить внутри контейнера. Вот мой однострочный ярлык для копирования и запуска файла Python:
Now I need to edit file and I don't have any editors inside:
How do I edit files?
so why not create the Dockerfile and include apt-get install command and generate your own container? Docker container is designed as this, not your way.
21 Answers 21
As in the comments, there's no default editor set - strange - the $EDITOR environment variable is empty. You can log in into a container with:
Or use the following Dockerfile:
Docker images are delivered trimmed to the bare minimum - so no editor is installed with the shipped container. That's why there's a need to install it manually.
EDIT
I also encourage you to read my post about the topic.
Maybe you could consider not installing an editor in each container you attach to, but rather just once on the docker host machine. As other commentators mentioned you can mount the volume, so you can edit the files that are going to be mounted, or navigate to the container data itself and edit the files in /var/lib/docker/
I just wanted to change one configuration from true to false in container. apt-get was not working due to permission issue inside container,so I tried sed -i 's/texttobechanged/textwanted/g' filename . It worked for me.
If you don't want to add an editor just to make a few small changes (e.g., change the Tomcat configuration), you can just use:
which copies it to your local machine (to your current directory). Then edit the file locally using your favorite editor, and then do a
to replace the old file.
@Igor This should actuallly be the accepted solution as it is the proper way to do it without adding additional packages to your container, while adding packages should be a secondary solution.
For Windows platforms, you can use, for example: docker cp
And what do you recommend for production? Should people be editing files in a container interactively in production?
Worth noting this method changes the file ownership. It's possible but a bit fiddly to change it back afterwards by going into the container as root ( docker exec -u 0 -it mycontainer bash ) and then running a chown command.
You can use cat if it's installed, which will most likely be the case if it's not a bare/raw container. It works in a pinch, and ok when copy+pasting to a proper editor locally.
cat will output each line on receiving a newline. Make sure to add a newline for that last line. ctrl-c sends a SIGINT for cat to exit gracefully. From the comments you see that you can also hit ctrl-d to denote end-of-file ("no more input coming").
ctrl+D is better than ctrl+C . ctrl+D sends an EOF . You do not need to add an extra newline at the end. With ctrl+C , if you forget to add the newline, you will lose the last line!
теперь, когда я нашел способ предоставить файлы хоста контейнеру (- V опция), я хотел бы сделать нечто противоположное:
Как я могу редактировать файлы из запущенного контейнера с помощью редактора хоста?
sshfs, вероятно, может выполнить эту работу, но поскольку запущенный контейнер уже является своего рода каталогом хоста, мне интересно, есть ли портативный (между aufs, btrfs и device mapper) способ сделать это?
пока это возможно, и другие ответы объясняют, как, вы должны избегать редактирования файлов в файловой системе Union, если можете.
ваше определение томов не совсем правильно - это больше обход файловой системы Union, чем предоставление файлов на хосте. Например, если я делаю:
каталог /volume-test внутри контейнера не будет частью файловой системы Union и вместо этого будет существовать где-то на хосте. Я не уточнил, где именно хозяин, как я могу наплевать - я не могу оставить хозяина файлов, создание каталогов, что является общим между контейнерами и хозяина. Вы можете узнать, где именно он находится на хосте с:
Если вам действительно нужно просто сделать быстрое редактирование файла, чтобы проверить что-то, либо используйте docker exec чтобы получить оболочку в контейнере и редактировать напрямую или использовать docker cp чтобы скопировать файл, отредактируйте его на хосте и скопируйте обратно.
ограничения с $ docker exec: он может присоединяться только к работающему контейнеру.
ограничения при запуске $ docker: он создаст новый контейнер.
Я использую плагин sftp из моей IDE.
- установите ssh-сервер для вашего контейнера и разрешите доступ root.
- запустите контейнер docker с-P localport: 22
- установите из IDE плагин sftp
вот скрипт, который я использую:
мы можем использовать другой способ редактирования файлов внутри рабочей емкости (это не будет работать, если контейнер купировались).
логика в том, чтобы:
- ) копировать файл из контейнера на хост
- ) редактировать файл на хосте, используя его редактор хоста
-)копируем файл обратно в контейнер
мы можем сделать все эти шаги вручную, но я написал простой скрипт bash, чтобы сделать это легко одним вызовом.
/ bin / dmcedit:
использование пример:
dmcedit CONTAINERNAME/path/to/file/in / container
у меня есть код всех моих сайтов под /srv в мои контейнеры.
My Dockerfile загружает код с помощью git и делает его частью образа для облегчения развертывания в производство.
но тогда как мне редактировать код в разработке? Я думал, что использование томов было решением, например: -v /docker/mycontainer/srv:/srv . Но он перезаписывает каталог в контейнере. Если это первый раз, когда я запускаю его, он опустошает его, потому что в Хосте ничего нет. Итак, что бы я ни сделал в Dockerfile, заблудился.
есть также каталоги и файлы внутри /srv/myapp что я хочу быть разделен между различными версиями моего приложения, например: /srv/myapp/user-uploads . Это обычная практика в профессиональной веб-разработки.
Итак, что я могу сделать, чтобы иметь возможность делать все эти вещи?:
- редактировать код в / srv в разработке
- share / srv / myapp / user-загрузки в разных версиях
- пусть Dockerfile загрузить код. Выполнение "git clone" или "git pull" вне Докера, по моему мнению, победит цель Докера. Кроме того, есть вещи, которые я не могу запустить на хосте, такие как миграции базы данных или другие скрипты приложения.
есть ли способ сделать обратное крепление громкости? Я имею в виду, что контейнер перезаписывает хост, а не наоборот.
Я думал, что soluiton может быть скопировать /гри /СРВ.развертывание-копирование перед запуском демона контейнера. А потом, когда я запустите демон проверить, если / srv.deployment-copy существует и копирует все обратно в /srv. Таким образом, я могу использовать /srv в качестве Тома и по-прежнему иметь возможность развертывать код на нем с помощью Dockerfile. Я уже использую псевдонимы для всех команд docker, поэтому автоматизация этого не будет проблемой. А ты как думаешь?
есть еще один способ запустить контейнер с объемом от другого контейнера:
если у вас есть некоторые постоянные данные, которыми вы хотите поделиться между контейнерами, или хотите использовать из непостоянных контейнеров, лучше всего создать именованный контейнер томов данных, а затем смонтировать данные из он.
давайте создадим новый именованный контейнер с объемом в акцию.
затем вы можете использовать флаг --volumes-from для монтирования Тома / dbdata в другой контейнер.
еще одна полезная функция, которую мы можем выполнять с томами заключается в использовании их для резервного копирования, восстановления и миграции. Мы делаем это с помощью флага --volumes-from, чтобы создать новый контейнер, который монтирует этот том, например Итак:
Я думаю, что вы не должны использовать монтирование каталога хоста в контейнер. Но вы можете использовать тома со всеми его возможностями. Вы можете редактировать файлы в томах, используя другие контейнеры с идеальным набором ваших редакторов и инструментов. И контейнер это ваше приложение будет чистым без накладных расходов.
структура:
-) Контейнер для данных приложения
docker run -d -v /data --name data
- ) Контейнер для двоичных файлов приложений
docker run -d --volumes-from data --name app1
-) Контейнер для редакторов и утилит для разработки
docker run -d --volumes-from data --name editor
Я нашел лучший способ редактировать код в разработке-установить все как обычно (включая клонирование репозитория вашего приложения), но переместить весь код в контейнер, чтобы сказать /srv/myapp.deploy.dev . Затем запустите контейнер с rw объем /srv/myapp , и init.D скрипт, который очищает этот Том и копирует новое содержимое внутри следующим образом:
Примечание: Вы не можете mount каталог контейнера для размещения каталога с -v .
Я не думаю, что вам нужно калечить /srv и /srv.развертывание-копировать. Если ты . --10-->
вы правы: для развертывание производства - вы можете построить изображение с исходным кодом ( git clone ), вы создаете образ для каждого выпуска. Не должно быть необходимости редактировать исходный код в производстве.
на среда разработки - вы должны построить изображение без исходного кода или вы можете затенить каталог исходного кода с Томом в случае использования одного и того же образа для развертывания/развития. Затем git клонирует исходный код локально и использует volume -v /hostdir/project/src:/srv/project поделиться исходным кодом с контейнера. Предпочтительно вы должны поделиться исходным кодом только для чтения ( :ro в конце) и любые временные или промежуточные файлы должны быть сохранены где-то еще в контейнере. У меня есть сценарии установки (миграция данных, перестроение некоторых файлов данных индекса / кэша и т. д.) выполняется при запуске контейнера, перед запуском службы. Поэтому, когда я чувствую, что я нужна свежая re-init , Я просто убиваю контейнер dev и запускаю его снова. Или я не останавливаю старый контейнер - я просто запускаю другой.
Я нашел хороший способ сделать это, используя только ГИТ:
предполагает, что у вас есть локальный Git с кодом. Git необходимо установить в контейнер. В качестве альтернативы вы можете использовать docker run и контейнер данных с общим Томом с установленным git.
предполагая, что git не является точкой входа контейнера, если git установлен в вашем контейнере docker, вы можете ssh в контейнер и запустить git clone / git pull . Из-за того, как Том совместно используется с хостом, изменения, внесенные из контейнера в файлы, также будут внесены в Хост (на самом деле это те же файлы).
Теперь мне нужно отредактировать файл, а внутри у меня нет редакторов:
Как редактировать файлы?
так почему бы не создать Dockerfile и не включить команду apt-get install и сгенерировать собственный контейнер? Контейнер Docker устроен так, а не по-вашему.
выполните следующую команду, чтобы установить nano в контейнер $ apt-get update $ apt-get install nano
Как и в комментариях, нет набора редакторов по умолчанию - странно - $EDITOR переменная среды пуста. Вы можете войти в контейнер с помощью:
Или используйте следующий Dockerfile:
Образы Docker доставляются обрезанными до минимума, поэтому редактор не устанавливается вместе с поставляемым контейнером. Поэтому его нужно устанавливать вручную.
РЕДАКТИРОВАТЬ
Я также рекомендую вам прочитать мой пост по этой теме.
Мне нужно было войти в систему как root, чтобы это сделать docker exec -u 0 -it container_name bash .
Возможно, вы могли бы подумать об установке редактора не в каждый контейнер, к которому вы подключаетесь, а только один раз на хост-машине докера. Как упоминали другие комментаторы, вы можете смонтировать том, чтобы вы могли редактировать файлы, которые собираетесь смонтировать, или перейти к самим данным контейнера и отредактировать файлы в /var/lib/docker/
Я просто хотел изменить одну конфигурацию с true на false в контейнере. apt-get не работал из-за проблемы с разрешением внутри контейнера, поэтому я попробовал sed -i 's/texttobechanged/textwanted/g' filename . У меня это сработало.
Если вы не хотите добавлять редактор только для того, чтобы внести несколько небольших изменений (например, изменить конфигурацию Tomcat), вы можете просто использовать:
который копирует его на ваш локальный компьютер (в ваш текущий каталог). Затем отредактируйте файл локально с помощью вашего любимого редактора, а затем выполните
заменить старый файл.
@Igor Это действительно должно быть приемлемым решением, поскольку это правильный способ сделать это без добавления дополнительных пакетов в ваш контейнер, в то время как добавление пакетов должно быть второстепенным решением.
Для платформ Windows вы можете использовать, например: docker cp
А что посоветуете для продакшена? Должны ли люди редактировать файлы в контейнере в интерактивном режиме в производственной среде?
Стоит отметить, что этот метод меняет владельца файла. Это возможно, но немного неудобно, чтобы потом изменить его обратно, войдя в контейнер как root ( docker exec -u 0 -it mycontainer bash ) и затем выполнив chown команду.
Вы можете использовать, cat если он установлен, что, скорее всего, будет иметь место, если это не пустой / необработанный контейнер. Он работает в крайнем случае, и нормально при копировании + вставке в соответствующий редактор локально.
cat будет выводить каждую строку при получении новой строки. Обязательно добавьте новую строку для этой последней строки. ctrl-c отправляет SIGINT cat для изящного выхода. Из комментариев вы видите, что вы также можете нажать ctrl-d, чтобы обозначить конец файла («больше не поступает ввод»).
Читайте также: