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

Пытаясь исправить ошибки и отладить проблемы с моим приложением, разбитым на несколько контейнеров, я часто редактирую файлы в контейнерах:

  • Либо я полностью ленив и устанавливаю nano и редактирую прямо в контейнере, либо

  • Я докер cp файл из контейнера, редактировать его, скопировать обратно и перезапустить контейнер

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

Теперь я часто ломаю стартовую программу контейнера, которая в случаях взлома является либо скриптом узла, либо скриптом веб-сервера на python, оба обычно не работают из-за синтаксических ошибок.

Есть ли способ сохранить эти контейнеры? Так как они не запускаются, я не могу выполнить в них докер, и поэтому они для меня потеряны. Затем я иду по маршруту rm / rmi / build / run после исправления файла, нарушающего работу, во входных данных сборки.

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

(Это похоже на работу на удаленном компьютере и нарушение сетевой конфигурации - таким образом соединение теряется "навсегда", и нужно использовать запасной вариант, если таковой существует).

Как редактировать файлы контейнера Docker с хоста? выглядит актуально, но устарело.

6 ответов

Решение

Отвечая на мой собственный вопрос.. все еще надеясь на лучший ответ от более знающего человека!!

Есть 2 возможности.

1) Редактирование файловой системы на хосте напрямую. Это несколько опасно и может полностью сломать контейнер, возможно, другие данные в зависимости от того, что идет не так.

2) Измените сценарий запуска на что-то, что никогда не завершится с ошибкой, например, запустив bash, выполнив исправления / изменения, а затем снова изменив загрузочную программу на желаемую (например, узел или что-то, что было раньше).

Больше деталей:

1) Использование

docker ps

найти работающие контейнеры или

docker ps -a

найти все контейнеры (включая остановленные) и

docker inspect (containername)

ищите "Id", одно из первых значений.

Это часть, которая содержит детали реализации и может измениться, помните, что вы можете потерять свой контейнер таким образом.

Идти к

/var/lib/docker/aufs/diff/9bc343a9..(long container id)/

и там вы найдете все файлы, которые изменяются по отношению к изображению, на котором основан контейнер. Вы можете перезаписывать файлы, добавлять или редактировать файлы.

Опять же, я бы не рекомендовал это.

2) Как описано на /questions/44831687/kak-zapustit-ostanovlennyij-kontejner-docker-drugoj-komandoj/44831743#44831743 вы можете найти конфигурацию json config.json по следующему пути:

/var/lib/docker/containers/9bc343a99..(long container id)/config.json

Там вы можете изменить аргументы, например, с "nodejs app.js" на "/bin/bash". Теперь перезапустите сервис Docker и запустите контейнер (вы должны увидеть, что он теперь правильно запускается). Вы должны использовать

docker start -i (containername)

чтобы убедиться, что он не уходит сразу. Теперь вы можете работать с контейнером и / или позже прикрепить

docker exec -ti (containername) /bin/bash

Кроме того, docker cp довольно полезен для копирования файлов, которые были отредактированы вне контейнера.

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

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

docker cp docker_web_1:/etc/apache2/sites-enabled/apache2.conf .

(исправьте файл)

docker cp apache.conf docker_web_1:/etc/apache2/sites-enabled/apache2.conf

Вы можете редактировать контейнерную файловую систему напрямую, но я не знаю, хорошая ли это идея. Сначала вам нужно найти путь к каталогу, который используется в качестве корневого каталога времени выполнения для контейнера. Бежать docker container inspect id/name, Ищи ключ UpperDir в выводе JSON.

Это ваш каталог.

В Docker Desktop есть такая возможность, но не все версии поддерживают эту функцию.

Используя Docker Desktop версии 4.17.0 (99724), можно редактировать файлы в остановленных контейнерах:

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

Также не забудьте сохранить его после этого.

Не лучший способ, но он работает: вы можете проверять файлы в контейнерах в подключаемом модуле vs code docker. Измените там файлы. Когда вы пытаетесь сохранить файл, он предлагает вам, что «контейнер не запущен, вы не можете сохранить файл». На рабочем столе докера нажмите кнопку запуска, затем есть несколько секунд, пока он не сломается и не остановится. В течение этих нескольких секунд у вас есть возможность сохранить измененные файлы. Если ваши изменения исправят ошибку, контейнер не остановится даже в этом сеансе. Опять же: это не супер решение, но работает.

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

  1. Используйте docker inspect, чтобы найти точку входа (в некоторых версиях она называется Path)
  2. Создайте клон с помощью docker run
  3. Введите clone, используя docker exec -ti bash (если контейнер *nix)
  4. Найдите местоположение файла точки входа, просмотрев клон, чтобы найти
  5. Скопируйте старый скрипт точки входа с помощью docker cp: ./
  6. Измените или создайте, например, новый сценарий точки входа

    #!/bin/bash tail -f /etc/hosts

  7. убедитесь, что у сценария есть права на выполнение
  8. Замените старую точку входа с помощью docker cp ./:
  9. запустить старый контейнер, используя start
  10. повторить шаги 6-9 до начала
  11. Исправить проблемы в контейнере
  12. При необходимости восстановите точку входа и повторите шаги 6–9 при необходимости.
  13. При необходимости удалите клон
Другие вопросы по тегам