Пытаясь исправить ошибки и отладить проблемы с моим приложением, разделенным на несколько контейнеров, я часто редактирую файлы в контейнерах:
либо я совсем ленив и устанавливаю nano и редактирую прямо в контейнере, либо
Я docker cp файл из контейнера, редактирую его, копирую обратно и перезапускаю контейнер
Это промежуточные шаги перед переходом к новому контенту для сборки контейнера, что занимает намного больше времени, чем выполнение описанного выше (что, конечно, только промежуточное звено / возня).
Теперь я часто нарушаю стартовую программу контейнера, которая в критических случаях является либо сценарием узла, либо сценарием веб-сервера python, оба обычно не работают из-за синтаксических ошибок.
Есть ли способ спасти эти контейнеры? Поскольку они не запускаются, я не могу выполнить в них docker exec, и поэтому они потеряны для меня. Затем я перехожу по маршруту rm / rmi / build / run после исправления ошибочного файла во входных данных сборки.
Как я могу либо редактировать файлы в остановленном контейнере, либо копировать их, либо запускать оболочку в остановленном контейнере - все, что позволяет мне исправить этот контейнер?
(Это немного похоже на работу на удаленном компьютере и нарушение сетевой конфигурации - таким образом соединение теряется «навсегда», и нужно использовать запасной вариант, если он существует.)
Как редактировать файлы контейнера Docker с хоста? выглядит актуально, но устарело.
docker cp
docker commit
команду для разрыва нового изображения.name=$(docker commit); docker run -it $name /bin/sh
буду делать то, что ты хочешь.Ответы:
У меня возникла проблема с контейнером, который не запускался из-за неправильного изменения конфигурации, которое я сделал. Мне удалось скопировать файл из остановленного контейнера и отредактировать его. что-то типа:
(поправьте файл)
источник
UpperDir
вамиdocker container inspect
- вам придется поэкспериментировать, чтобы увидеть, как система наложения представляет файлы в базовой структуре, которые были удалены на верхнем уровне.Отвечая на свой вопрос ... все еще надеюсь на лучший ответ от более знающего человека !!
Есть 2 возможности.
1) Редактирование файловой системы непосредственно на хосте . Это несколько опасно и может полностью сломать контейнер, возможно, другие данные в зависимости от того, что пойдет не так.
2) Изменение сценария запуска на что-то, что никогда не дает сбоев, например запуск bash, выполнение исправлений / правок, а затем изменение программы запуска снова на желаемую (например, узел или что-то еще).
Подробнее:
1) Использование
найти работающие контейнеры или
найти все контейнеры (в том числе остановленные) и
ищите "Id", одно из первых значений.
Это часть, которая содержит детали реализации и может измениться, имейте в виду, что таким образом вы можете потерять свой контейнер.
Перейти к
и там вы найдете все файлы, которые были изменены по отношению к образу, на котором основан контейнер. Вы можете перезаписывать файлы, добавлять или редактировать файлы.
Опять же, я бы не рекомендовал это.
2) Как описано на https://stackoverflow.com/a/32353134/586754, вы можете найти конфигурацию json config.json по пути вроде
Там вы можете изменить аргументы, например, с «nodejs app.js» на «/ bin / bash». Теперь перезапустите службу докеров и запустите контейнер (вы должны увидеть, что теперь он правильно запускается). Вы должны использовать
чтобы убедиться, что он не прекратится сразу. Теперь вы можете работать с контейнером и / или позже присоединиться с
docker exec -ti (containername) /bin/bash
Кроме того, docker cp весьма полезен для копирования файлов, которые редактировались вне контейнера.
Кроме того, к этим мерам следует прибегать только в том случае, если контейнер все равно более или менее «потерян», поэтому любое изменение будет улучшением.
источник
config.json
файлы каждый раз, когда я их редактировал,Вы можете редактировать файловую систему контейнера напрямую, но я не знаю, хорошая ли это идея. Сначала вам нужно найти путь к каталогу, который используется как корень времени выполнения для контейнера. Беги
docker container inspect id/name
. Найдите ключUpperDir
в выводе JSON.Это ваш каталог.
источник
Если вы пытаетесь перезапустить остановленный контейнер и вам нужно изменить контейнер из-за неправильной конфигурации, но контейнер не запускается, вы можете сделать следующее, которое работает с помощью команды «docker cp» (аналогично предыдущему предложению). Эта процедура позволяет удалять файлы и вносить любые другие необходимые изменения. Если повезет, вы можете пропустить многие шаги, указанные ниже.
Измените или создайте, например, новый сценарий точки входа
#!/bin/bash tail -f /etc/hosts
источник