Любые быстрые способы сбросить изменения в контейнере docker?

#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 он имеет ограниченную функциональность.