Получение воспроизводимых слоев докера на разных хостах - PullRequest
0 голосов
/ 29 декабря 2018

Проблема: я не могу воспроизвести слои докера, используя точно такой же контент (на одном компьютере или в кластере 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

Я что-то упустил или это поведение задуманно?

Существуют ли какие-либо технические приемы для получения воспроизводимых / повторно используемых слоев, которые не заставляют меня выполнять одно из следующих действий

  1. Совместное использование кэша Docker для всех машин
  2. Выполнение проверки«предыдущего» изображения перед построением следующего

В конечном итоге эта проблема не позволяет мне получать тонкие слои с постоянно меняющимся кодом приложения, сохраняя слои моих зависимостей в отдельном и редко меняющемся слое.

1 Ответ

0 голосов
/ 30 декабря 2018

После некоторого дополнительного поиска в Google, я нашел отличный пост , описывающий решение этой проблемы.

Начиная с версии 1.13, в Docker есть опция --cache-from, которую можно использовать, чтобы указать Docker искать другие изображения для слоев.Важная вещь - изображение должно быть явно потянуто, чтобы оно работало + вам все еще нужно указать, какое изображение сделать.Это может быть latest или любое другое «вращающееся» изображение, которое у вас есть.

Учитывая, что, к сожалению, нет способа создать такой же слой в «изоляции», но cache-from решает корневую проблему - как в конечном итогеповторно использовать несколько слоев во время сборки ci.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...