Как Docker сохраняет изображение неизменным
Из документации Docker:
Образ Docker доступен только для чтения. Когда Docker запускает контейнер из изображения, он добавляет слой чтения-записи поверх изображения (используя UnionFS), в котором выполняется ваше приложение.
Как изменения согласовываются между слоями? Если я изменю содержимое файла, Docker будет только отслеживать дельту или он сохранит измененный файл в новом слое?
Я смотрел на это обсуждение в суперпользователе, но все еще не уверен насчет окончательной структуры изображения.
2 ответа
Если у вас есть файл в слое и измените его (используя RUN
, или же COPY
или же ADD
), новый слой создается с новым целым файлом, а не с дельтой. Еще хуже, если вы только измените атрибуты разрешения файла, RUN chmod 400 file
создается новый слой, и все содержимое файла находится в этом новом слое.
С уважением
Каждый слой изображения является 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
Diff - это содержимое RO-слоя контейнера. И когда вы создаете изображение, каждая команда RUN генерирует из него слой, который сохраняется как часть вашего окончательного изображения.