Docker изменить файл в контейнере

Обновлено: 04.07.2024

у меня есть код всех моих сайтов под /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 . Из-за того, как Том совместно используется с хостом, изменения, внесенные из контейнера в файлы, также будут внесены в Хост (на самом деле это те же файлы).

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

Как я могу редактировать файлы из запущенного контейнера с помощью редактора хоста?

sshfs, вероятно, может выполнить эту работу, но поскольку запущенный контейнер уже является своего рода каталогом хоста, мне интересно, есть ли портативный (между aufs, btrfs и device mapper) способ сделать это?

пока это возможно, и другие ответы объясняют, как, вы должны избегать редактирования файлов в файловой системе Union, если можете.

ваше определение томов не совсем правильно - это больше обход файловой системы Union, чем предоставление файлов на хосте. Например, если я делаю:

каталог /volume-test внутри контейнера не будет частью файловой системы Union и вместо этого будет существовать где-то на хосте. Я не уточнил, где именно хозяин, как я могу наплевать - я не могу оставить хозяина файлов, создание каталогов, что является общим между контейнерами и хозяина. Вы можете узнать, где именно он находится на хосте с:

Если вам действительно нужно просто сделать быстрое редактирование файла, чтобы проверить что-то, либо используйте docker exec чтобы получить оболочку в контейнере и редактировать напрямую или использовать docker cp чтобы скопировать файл, отредактируйте его на хосте и скопируйте обратно.

ограничения с $ docker exec: он может присоединяться только к работающему контейнеру.

ограничения при запуске $ docker: он создаст новый контейнер.

Я использую плагин sftp из моей IDE.

  1. установите ssh-сервер для вашего контейнера и разрешите доступ root.
  2. запустите контейнер docker с-P localport: 22
  3. установите из IDE плагин sftp

вот скрипт, который я использую:

мы можем использовать другой способ редактирования файлов внутри рабочей емкости (это не будет работать, если контейнер купировались).

логика в том, чтобы:
- ) копировать файл из контейнера на хост
- ) редактировать файл на хосте, используя его редактор хоста
-)копируем файл обратно в контейнер

мы можем сделать все эти шаги вручную, но я написал простой скрипт bash, чтобы сделать это легко одним вызовом.

/ bin / dmcedit:

использование пример:

dmcedit CONTAINERNAME/path/to/file/in / container

Теперь мне нужно отредактировать файл, а внутри у меня нет редакторов:

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

Как и в комментариях, нет набора редакторов по умолчанию - странно - переменная среды $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 <name> 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:

Я установил Sentry onpremise и, немного поработав, заставил его работать и изменил > на правильный URL с помощью командной строки. Однако есть еще 2 проблемы:

  • Эта опция не постоянна
  • Вы не можете сделать то же самое для параметра mail.from , который можно установить только перед запуском.

В игре задействованы 3 файла конфигурации, но не все из них регистрируются, что сбивает с толку.

enter image description here

При перезапуске контейнеров новая конфигурация не загружается.

Связанная проблема. Однако я не знаю, что делать после изменения конфигурации, как в комментарии ( SENTRY_OPTIONS['mail.from'] )

2 ответа

Вам необходимо сделать ваши измененные файлы конфигурации видимыми внутри контейнера.

Если они встроены в образ (возможно, с помощью КОПИРОВАНИЯ или ДОБАВЛЕНИЯ в Dockerfile ), то перезапуск вашего контейнера не поможет, потому что вы делаете это на старом образе. Вам следует перестроить образ, остановив старый и запустив новый. Скорее надоедливый и подверженный ошибкам способ.

Лучше всего «смонтировать» ваши файлы через тома. Тома Docker могут быть отдельными файлами, а не только каталогами. Вы можете добавить раздел volumes в свой docker-compose.yml :

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

Надеюсь это поможет. Всего наилучшего в Новом году!

Если файлы конфигурации хранятся как конфигурации докеров, я обнаружил, что это руководство работает .

  • В основном добавляйте обновление как НОВУЮ конфигурацию
  • скажите службе удалить старую, а затем добавить новую конфигурацию в качестве используемой. Сервис будет перезапущен
  • теперь вы можете удалить старую конфигурацию докера

Это не очень хорошо, и если вы хотите назвать новую конфигурацию старым идентификатором конфигурации, вам придется повторить это снова!

Читайте также: