#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
создается новый слой, и все содержимое файла размещается на этом новом слое.
С уважением