Як редагувати файли в зупиненому / не запускається контейнері докера


93

Намагаючись виправити помилки та налагодити проблеми в моїй програмі, яка розділена на кілька контейнерів, я часто редагую файли в контейнерах:

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

  • Я завантажую файл cp з контейнера, редагую його, копіюю назад і перезапускаю контейнер

Це проміжні кроки перед тим, як переходити до нового вмісту для побудови контейнера, який займає набагато більше часу, ніж виконання вищезазначеного (що, звичайно, є лише проміжним / непомітним).

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

Чи є спосіб зберегти ці контейнери? Оскільки вони не запускаються, я не можу виконувати їх, і, отже, вони для мене загублені. Потім я йду по маршруту rm / rmi / build / run після виправлення порушувального файлу у введенні збірки.

Як я можу або редагувати файли в зупиненому контейнері, або копіювати їх, або запускати оболонку в зупиненому контейнері - все, що дозволяє мені виправити цей контейнер?

(Це схоже на роботу на віддаленому комп’ютері та порушення мережевої конфігурації - таким чином зв’язок втрачається „назавжди“, і потрібно використовувати резервний варіант, якщо такий існує.)

Як редагувати файли контейнера Docker з хосту? виглядає доречно, але застаріло.


Це також може бути обхідним шляхом stackoverflow.com/a/32353134/586754 - сподіваючись на краще рішення ще.
Andreas Reiff,

1
можливо, вам варто розглянути можливість встановлення тому, щоб ви могли редагувати файли на хості, а не всередині контейнера. Після задоволення своїм кодом ви можете вільно docker cpпереглядати файли в контейнер (або створювати нове зображення)
Thomasleveil

Так, це було б трохи пізно, хоча я б не налаштував подібні речі з самого початку. Я думаю, це не працює для відновлення.
Andreas Reiff,

Багато читачів хочуть лише переглядати файли, а не редагувати їх. У цих випадках ви можете використовувати docker commitкоманду, щоб розбити нове зображення. name=$(docker commit); docker run -it $name /bin/shбуде робити те, що ти хочеш.
Att Righ

отже, здається, що файлові системи зупинених контейнерів на кінець відносно постійні?
Webwoman

Відповіді:


138

У мене була проблема з контейнером, який не запускався через погану зміну конфігурації, яку я зробив. Я зміг скопіювати файл із зупиненого контейнера та відредагувати його. щось на зразок:

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

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

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

22
Це має бути прийнятою відповіддю. Чомусь я не думав, що КП працював на зупинених контейнерах. Приємно!
Proximo

Ідеально Я скопіював файл із контейнера (я знав його шлях), а потім відредагував його, а потім скопіював назад у контейнер у те саме місце. Працював у мене! Дякую!
Наваз,

Чи є спосіб видалити файл?
кодлан

1
@kodlan Тільки якщо це відображається лише у тому, UpperDirзвідки ви отримуєте docker container inspect- вам доведеться експериментувати, щоб побачити, як система накладання представляє файли в базовій структурі, які були видалені у верхньому шарі.
Тім Баверсток

Дякуємо, це допомогло мені виправити мій контейнер MySQL, який працює в docker на macOS.
mazedlx

60

Відповідаючи на моє власне запитання .. все ще сподіваючись на кращу відповідь від більш знайомої людини !!

Є 2 можливості.

1) Редагування файлової системи безпосередньо на хості . Це дещо небезпечно і має шанс повністю розбити контейнер, можливо інші дані, залежно від того, що піде не так.

2) Зміна сценарію запуску на щось, що ніколи не підводить, наприклад, запуск bash, виправлення / редагування, а потім зміна програми запуску знову на потрібну (наприклад, вузол або будь-що інше, що було раніше).

Детальніше:

1) Використання

docker ps

щоб знайти запущені контейнери або

docker ps -a

знайти всі контейнери (включаючи зупинені) та

docker inspect (containername)

шукайте "Id", одне з перших значень.

Це частина, яка містить деталі реалізації та може змінитися. Зверніть увагу, що таким чином ви можете втратити контейнер.

Йти до

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

і там ви знайдете всі файли, змінені до зображення, на якому базується контейнер. Ви можете перезаписати файли, додавати або редагувати файли.

Знову ж таки, я б не рекомендував цього.

2) Як описано на https://stackoverflow.com/a/32353134/586754, ви можете знайти конфігурацію json config.json за таким шляхом, як

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

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

docker start -i (containername)

щоб переконатися, що це не припиняється відразу. Тепер ви можете працювати з контейнером та / або пізніше прикріпити

docker exec -ti (containername) /bin/bash

Крім того, docker cp досить корисний для копіювання файлів, відредагованих за межами контейнера.

Крім того, слід повернутися до цих заходів лише в тому випадку, якщо контейнер у будь-якому випадку більш-менш "загублений", тому будь-які зміни були б покращенням.


Все ще сподіваючись на кращу відповідь - так що сміливо дайте її, я також переміщу тег "ansered".
Андреас Рейфф,

Я скористався другим способом, і мені довелося перезапустити службу докера, щоб примусити перезаписувати config.jsonфайли кожного разу, коли я їх редагував
Віталій Ісаєв

2
У мене є config.v2.json, і кожен раз, коли я запускаю контейнер зомбі, він повертає моє оновлення Path / EntryPoint і вмирає ще раз. Використання "docker cp" для оновлення сценарію entrypoint.sh для простого запуску bash це виправило.
Кертіс Яллоп,

@CurtisYallop Я переживаю те саме. Як ви це вирішили?
Бретт Маклейн,

1
@BrettMcLain Я використовував docker cp, а не редагував його на хості. Ось так: Знайдіть місце розташування сценарію точки входу: "docker перевірити ім'я_контейнера | grep Entry". Отримати сценарій: "docker cp container_name: /entrypoint.sh ./". (Редагувати) Повернути сценарій назад у контейнер: "docker cp entrypoint.sh container_name: /entrypoint.sh". Ви можете зробити пункт входу запущеним bash або запустити цикл сну, наприклад "while:; do sleep 10; done". Перший рядок сценарію має бути "#! / Bin / bash".
Кертіс Яллоп,

9

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

Це ваш каталог.


Знайшов каталог, але він містив не всі файли.
aioobe

Це OverlayFS, тому ваші файли повинні бути в одному в цих каталогах.
Tejas Sarade

Назва каталогу може відрізнятися від "UpperDir", наприклад, у моєму випадку це Source. Але це спрацювало!
Раджні Кевлані

0

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

  1. Використовуйте перевірку докера, щоб знайти точку входу, (з іменем Шлях у деяких версіях)
  2. Створіть клон використовуваного запуску докера
  3. Введіть клон за допомогою 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. Видаліть клон, якщо потрібно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.