Почему Docker аннулирует кэш сборки после изменения разрешений на копирование файла с флагом —chmod?

#docker #file-permissions

Вопрос:

Мой рабочий каталог содержит два файла:

  • Dockerfile приведено ниже
 FROM ubuntu:20.04
COPY --chmod=755 ./hello.txt /opt/
 
  • пустой hello.txt файл с 644 разрешениями chmod

Я выполнил следующую последовательность команд, используя Docker 20.10.8 :

  1. docker build . первая сборка, из кэша ничего не используется повторно
 #6 [2/2] COPY --chmod=755 ./hello.txt /opt/
#6 sha256:2cb62e01e8edffaed06aeda7d8fa85b5f89850564f7458ab0be5cbe3d90478bf
#6 DONE 0.0s
 
  1. docker build . вторая сборка без каких-либо изменений, все слои повторно используются из кэша
 #6 [2/2] COPY --chmod=755 ./hello.txt /opt/
#6 sha256:7d6fd54f3d6cc543bd4d186861d7ae116c5ed16c7ebca40a37fdbe027bce9ecc
#6 CACHED
 
  1. chmod 777 hello.txt измените разрешения с 644 на 777
  2. docker build . => другая сборка после изменения разрешений > COPY --chmod слой не используется повторно из кэша
 #4 [2/2] COPY --chmod=755 ./hello.txt /opt/
#4 sha256:3f74f87506d9be5cbb722a723bf1422ce0a24b538201d719f712bbb4915de5a6
#4 DONE 0.0s
 

Почему команда 4 не повторно использует кэш сборки, как команда 2, даже если разрешения и содержимое файла идентичны на изображении из-за --chmod флага в COPY инструкции?

Комментарии:

1. Потому что кэш зависит от контекста исходного файла, а не от содержимого изображения.

2. Спасибо за быстрый ответ. Я понимаю, почему это относится к обычным COPY заявлениям без --chmod . Однако есть ли техническая причина, по которой Docker заботится о разрешениях исходного файла для определения допустимости кэша при использовании --chmod флага COPY ? Разве разрешения на исходный файл не имеют значения, если они перезаписаны --chmod флагом?

3. Дело в том, что он не проверяет: он проверяет только время изменения исходных файлов. Если исходный файл изменился, кэш становится недействительным. Он не смотрит на конкретные атрибуты (он не знает, что «изменились только разрешения»); все, что он знает, это «исходный файл новее, чем кэшированная версия». Возможно, разрешения изменились. Может быть, там есть новый контент. Кто знает?