Как Docker сохраняет неизменным изображение

#docker #unionfs

#docker #unionfs

Вопрос:

Из документации Docker :

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

Как согласовываются изменения между слоями? Если я изменю содержимое файла, будет ли Docker отслеживать только delta или сохранит измененный файл в новом слое?

Я просмотрел это обсуждение на superuser, но все еще не уверен в окончательной структуре изображения.

Ответ №1:

Каждый слой изображения является RO, за исключением верхнего слоя контейнера RW и любых подключений тома, которые находятся за пределами многоуровневой файловой системы. Если вы загружаете много файлов на первом уровне и удаляете их на втором уровне (контейнер, запущенный поверх первого уровня), второй уровень содержит команду удаления, но файлы все еще существуют на первом уровне. Вы можете увидеть результаты этого с помощью docker diff :

 $ docker run -it --name busytest busybox
/ # echo "hello world" >/root/test.txt
/ # rm /bin/rpm
/ # rm /bin/timeout
/ # rm /bin/wall
/ # exit

$ docker diff busytest
C /bin
D /bin/rpm
D /bin/timeout
D /bin/wall
C /root
A /root/.ash_history
A /root/test.txt
  

Разница — это содержимое слоя RO контейнера. И когда вы создаете изображение, каждая команда ЗАПУСКА генерирует из него слой, который сохраняется как часть вашего конечного изображения.

Ответ №2:

Если у вас есть файл в слое и вы изменяете его (используя RUN , или COPY или ADD ), создается новый слой с новым файлом целиком, а не с дельтой. Еще хуже, если вы меняете только атрибуты разрешений файла, RUN chmod 400 file создается новый слой, и все содержимое файла размещается на этом новом слое.

С уважением