2016-10-21 3 views
2

Из документации Докер:Как Docker сохранить изображение неизменны

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

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

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

ответ

1

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

С уважением

3

Каждый слой изображения представляет собой RO, кроме верхнего слоя контейнера RW и любых томов, которые находятся за пределами многоуровневой файловой системы. Если вы загружаете много файлов на первом уровне и удаляете их во втором слое (контейнер, работающий поверх первого слоя), второй слой содержит команду delete, но файлы все еще существуют в первом слое. Вы можете увидеть результаты этого с 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 контейнера. И когда вы создаете изображение, каждая команда RUN генерирует слой из этого, который хранится как часть вашего окончательного изображения.