#docker
#docker
Вопрос:
Я мог бы использовать docker diff
для проверки изменений в файлах или каталогах в файловой системе контейнера, например, следующий:
$ docker diff inventory_web
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/uwsgi_temp
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
C /run
A /run/nginx.pid
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
Но мне интересно, могу ли я использовать какие-либо быстрые способы сброса содержимого /etc/nginx/conf.d/default.conf
изображения по умолчанию, которое использовал этот контейнер?
Что-то вроде операции в git: git checkout -- default.conf
, можем ли мы использовать что-то вроде docker reset
или docker checkout
и т.д.?
В настоящее время мне пришлось запустить новый контейнер, основанный на том же изображении, и скопировать файлы из этого контейнера в мой старый контейнер. Но я думаю, что файловая система наложения docker, безусловно, знает, что изменилось в rw
слое по сравнению со ro
слоем в изображении, поскольку он основан на слоях, иначе как docker diff
это могло бы работать?
Комментарии:
1. Интересный вопрос! Вы можете сделать это вручную
docker cp
, извлекая файл из запущенного контейнера при запуске, а затем возвращая его обратно, когда захотите выполнить сброс. Но вы правы, движок должен быть в состоянии сделать это за вас, просто отбросив информацию об уровне r / w для этого файла. Не уверен, что это действительно существует как вызов API.2. Я думаю, что короткий ответ на это заключается в том, что это невозможно, потому что это просто не то, как
docker
предназначено для использования: если вы хотите «сбросить» контейнер, вы должны просто удалить его и запустить новый из изображения; если вы хотите сохранить постоянные данные из предыдущих запусков, вы должны использоватьтома. Так что, может быть, вы можете добавить немного больше контекста о том, почему вы хотите это сделать и чего вы хотите достичь. Может быть, есть лучший подход к этому.3. @acran На самом деле, это не нужно, когда для производства. Мой сценарий таков: я работаю над сторонним проектом, код которого находится в контейнере. Иногда я меняю код на пробный, если ok отправит PR. Если не в порядке, я хочу сбросить изменение и попробовать другое решение, конечно, я мог бы сделать резервную копию старых файлов с помощью cp xxx xxx.bak, но иногда я забываю об этом. ДА, вы можете иметь в виду, что нам нужно изменить код в git, а затем отправить изменения на промежуточный контейнерный сервер для тестирования. Я знал процесс, но я не являюсь сопровождающим проекта, я просто хочу внести некоторые изменения, не хочу, чтобы здесь была целая инфраструктура для обеспечения моего процесса…
4. @acran В любом случае, мое беспокойство здесь связано с какой-то быстрой задачей, которая непосредственно обрабатывает вещи в контейнере на этапе разработки, а не на этапе окончательного производства. На самом деле, я не видел использования
docker cp
в конечном производственном контейнере, намdocker cp
вообще не нужно. Из принципа docker все должно быть в образе или использовать привязки. Зачем нужноdocker cp?
, но оно там существует, я думаю, это для простоты разработки…
Ответ №1:
Docker — это не SCM, но вы можете использовать своего рода хак, чтобы скопировать файл из вашего базового образа.
docker cp $(docker create --rm <container_image>):/etc/nginx/conf.d/default.conf default.conf
docker cp default.conf <running_container_id>:/etc/nginx/conf.d/default.conf
Комментарии:
1. Спасибо, это на самом деле то, что я делал в настоящее время, но мне интересно, не пропустил ли я какое-то простое использование…
2. Это сработает, но я думаю, что OP спрашивает, может ли движок Docker сделать это для вас изначально. Я думаю, что концептуально это должно быть возможно.
3. Вы можете играть с нижними каталогами overlayfs / diff и, вероятно, извлекать файл оттуда, но это было бы намного сложнее. Создание контейнера в этом случае обходится намного дешевле, если учесть приложенные усилия.
4. @max Насколько я знаю, у docker нет собственного подхода к решению этой задачи, поскольку
docker diff
он имеет ограниченную функциональность.