Проблема: я не могу воспроизвести слои докера, используя точно такой же контент (на одном компьютере или в кластере CI, где что-то построено из git repo)
Рассмотрим этот простой пример
$ echo "test file" > test.txt
$ cat > Dockerfile <<EOF
FROM alpine:3.8
COPY test.txt /test.txt
EOF
Если я создаю образ на одном компьютере с включенным кэшированием, тогда последний слой с скопированным файлом будет совместно использоваться для изображений
$ docker build -t test:1 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM alpine:3.8
3.8: Pulling from library/alpine
cd784148e348: Already exists
Digest: sha256:46e71df1e5191ab8b8034c5189e325258ec44ea739bba1e5645cff83c9048ff1
Status: Downloaded newer image for alpine:3.8
---> 3f53bb00af94
Step 2/2 : COPY test.txt /test.txt
---> decab6a3fbe3
Successfully built decab6a3fbe3
Successfully tagged test:1
$ docker build -t test:2 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM alpine:3.8
---> 3f53bb00af94
Step 2/2 : COPY test.txt /test.txt
---> Using cache
---> decab6a3fbe3
Successfully built decab6a3fbe3
Successfully tagged test:2
Но с отключенным кэшем (или просто с использованием другого компьютера) я получу другие значения хеш-функции.
$ docker build -t test:3 --no-cache .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM alpine:3.8
---> 3f53bb00af94
Step 2/2 : COPY test.txt /test.txt
---> ced4dff22d62
Successfully built ced4dff22d62
Successfully tagged test:3
В то же время команда истории показывает, что содержимое файла было одинаковым
$ docker history test:1
IMAGE CREATED CREATED BY SIZE COMMENT
decab6a3fbe3 6 minutes ago /bin/sh -c #(nop) COPY file:d9210c40895e
$ docker history test:3
IMAGE CREATED CREATED BY SIZE COMMENT
ced4dff22d62 27 seconds ago /bin/sh -c #(nop) COPY file:d9210c40895e
Я что-то упустил или это поведение задуманно?
Существуют ли какие-либо технические приемы для получения воспроизводимых / повторно используемых слоев, которые не заставляют меня выполнять одно из следующих действий
- Совместное использование кэша Docker для всех машин
- Выполнение проверки«предыдущего» изображения перед построением следующего
В конечном итоге эта проблема не позволяет мне получать тонкие слои с постоянно меняющимся кодом приложения, сохраняя слои моих зависимостей в отдельном и редко меняющемся слое.