Докер: извлечение изображения с помощью дайджеста, внутри которого используется тег - PullRequest
4 голосов
/ 29 марта 2019

Возьмем, к примеру, следующий репозиторий, размещенный на dockerhub: https://hub.docker.com/r/frolvlad/alpine-miniconda3


Следующая команда выполняется для извлечения изображения через дайджест:

docker pull frolvlad/alpine-miniconda3:python3.7@sha256:9bc9c096713a6e47ca1b4a0d354ea3f2a1f67669c9a2456352d28481a6ce2fbe


Основываясь на документации докера , получение изображения с помощью дайджеста имеет следующее свойство:

Использование этой функции «привязывает» изображение к определенной версии во времени

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

Самое главное, первая строка файла Docker читает

FROM frolvlad/alpine-glibc:alpine-3.9

Я бы предположил, основываясь на моих показаниях, если автор изменяет эту первую строку в файле docker и нажимает (даже если это тот же тег), на меня это не повлияет, так как я указываю на дайджест изображения. Тем не мение, из-за того, что автор ссылался на тег в файле dockerfile, а не на дайджест, как я могу подтвердить, какой файл dockerfile / base был использован для создания их образа? Как может показаться, простого анализа файла docker-файла frolvlad/alpine-glibc:alpine-3.9 будет недостаточно, так как он мог бы отличаться во время создания образа.

Ответы [ 2 ]

2 голосов
/ 29 марта 2019

Вы правы, что полученное дайджестом изображение эффективно (!) Неизменным.

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

После создания слои изображения не изменяются.Таким образом, даже если изображение FROM было изменено, оно не изменит ваши существующие изображения.

Однако, если вы перестроили свои изображения, используя новое (с таким же тегом) изображение FROM, дайджест вашего изображенияизменится, и это будет для вас сигналом, что что-то изменилось.

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

Тем не менее, это все равно все вниз (или вверх), и поэтому вырекурсивно делегируют доверие изображениям, из которых получено ваше, вплоть до SCRATCH.

Это одна из причин, почему рекомендуются инструменты для уязвимости изображений.

Я изучил это для своего собственного образованиянедавно:

https://medium.com/google-cloud/adventures-w-docker-manifests-78f255d662ff

0 голосов
/ 29 марта 2019

Похоже, docker image history может быть чем-то, что может помочь вам определить такие изменения.

Вот полный пример этого тега и дайджеста, который вы используете в качестве примера:

$ docker image history --no-trunc 34982ce484b5
IMAGE                                                                     CREATED             CREATED BY                                              SIZE                COMMENT
sha256:34982ce484b5d709bffb6bf8cca2163ff9231d1a900305f888a5baf59a3414cd   4 weeks ago         /bin/sh -c CONDA_VERSION="4.5.12" &&     CONDA_MD5_CHECKSUM="866ae9dff53ad0874e1d1a60b1ad1ef8" &&         apk add --no-cache --virtual=.build-dependencies wget ca-certificates bash &&         mkdir -p "$CONDA_DIR" &&     wget "http://repo.continuum.io/miniconda/Miniconda3-${CONDA_VERSION}-Linux-x86_64.sh" -O miniconda.sh &&     echo "$CONDA_MD5_CHECKSUM  miniconda.sh" | md5sum -c &&     bash miniconda.sh -f -b -p "$CONDA_DIR" &&     echo "export PATH=$CONDA_DIR/bin:\$PATH" > /etc/profile.d/conda.sh &&     rm miniconda.sh &&         conda update --all --yes &&     conda config --set auto_update_conda False &&     rm -r "$CONDA_DIR/pkgs/" &&         apk del --purge .build-dependencies &&      mkdir -p "$CONDA_DIR/locks" &&     chmod 777 "$CONDA_DIR/locks"                                              190MB
<missing>                                                                 4 weeks ago         /bin/sh -c #(nop)ENV PATH=/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin                                              0B
<missing>                                                                 4 weeks ago         /bin/sh -c #(nop)ENV CONDA_DIR=/opt/conda                                              0B
<missing>                                                                 6 weeks ago         /bin/sh -c ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" &&     ALPINE_GLIBC_PACKAGE_VERSION="2.29-r0" &&     ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" &&     ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" &&     ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" &&     apk add --no-cache --virtual=.build-dependencies wget ca-certificates &&     echo         "-----BEGIN PUBLIC KEY-----        MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m        y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu        tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp        m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY        KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc        Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m        1QIDAQAB        -----END PUBLIC KEY-----" | sed 's/   */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" &&     wget         "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME"         "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME"         "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" &&     apk add --no-cache         "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME"         "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME"         "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" &&         rm "/etc/apk/keys/sgerrand.rsa.pub" &&     /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true &&     echo "export LANG=$LANG" >/etc/profile.d/locale.sh &&         apk del glibc-i18n &&         rm "/root/.wget-hsts" &&     apk del .build-dependencies &&     rm         "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME"         "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME"      "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"   6.71MB
<missing>                                                                 6 weeks ago         /bin/sh -c #(nop)ENV LANG=C.UTF-8                                              0B
<missing>                                                                 8 weeks ago         /bin/sh -c #(nop)CMD ["/bin/sh"]                                              0B
<missing>                                                                 8 weeks ago         /bin/sh -c #(nop) ADD file:2a1fc9351afe35698918545b2d466d9805c2e8afcec52f916785ee65bbafeced in /                                              5.53MB

В четвертой строке вывода я вижу, что 6 недель назад изображение изменилось с помощью команды оболочки, начинающейся с ALPINE_GLIBC_BASE_URL=..., которая является именно первой RUN командой родителя изображение .

Так что, действительно, здесь вы можете видеть, что это изображение изменилось во времени, там, из-за этого.

Но и вот важный момент для вас: вы также можете видеть, что изображение докера состоит из RUN его родительского изображения, а не содержит какую-либо ссылку к нему вообще (вы также можете запустить docker image inspect [image_digest], чтобы дважды это проверить).

Это означает, что докер объединяет все части изображения и делает дайджесты из того, какие команды создавали изображение в первую очередь, не из-за того, что FROM не изменился, а изменилось лежащее в основе изображение.

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

...