#docker #file-permissions
Вопрос:
Мой рабочий каталог содержит два файла:
Dockerfile
приведено ниже
FROM ubuntu:20.04
COPY --chmod=755 ./hello.txt /opt/
- пустой
hello.txt
файл с644
разрешениями chmod
Я выполнил следующую последовательность команд, используя Docker 20.10.8
:
docker build .
первая сборка, из кэша ничего не используется повторно
#6 [2/2] COPY --chmod=755 ./hello.txt /opt/
#6 sha256:2cb62e01e8edffaed06aeda7d8fa85b5f89850564f7458ab0be5cbe3d90478bf
#6 DONE 0.0s
docker build .
вторая сборка без каких-либо изменений, все слои повторно используются из кэша
#6 [2/2] COPY --chmod=755 ./hello.txt /opt/
#6 sha256:7d6fd54f3d6cc543bd4d186861d7ae116c5ed16c7ebca40a37fdbe027bce9ecc
#6 CACHED
chmod 777 hello.txt
измените разрешения с 644 на 777docker 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. Дело в том, что он не проверяет: он проверяет только время изменения исходных файлов. Если исходный файл изменился, кэш становится недействительным. Он не смотрит на конкретные атрибуты (он не знает, что «изменились только разрешения»); все, что он знает, это «исходный файл новее, чем кэшированная версия». Возможно, разрешения изменились. Может быть, там есть новый контент. Кто знает?