«Распространенные» изображения содержат только ваше приложение и зависимости от времени выполнения. Они не содержат менеджеров пакетов, снарядов или любых других программ, которые вы ожидаете найти в стандартном распределении Linux.
Для получения дополнительной информации см. Этот разговор (видео).
С марта 2023 года изображения распространения используют манифесты OCI, если вы видите ошибки, ссылающиеся application/vnd.oci.image.manifest.v1+json
или application/vnd.oci.image.index.v1+json
, обновите инструмент контейнера (Docker, джиб и т. Д.)
Ограничение того, что находится в вашем контейнере для выполнения, и именно то, что необходимо для вашего приложения, является наилучшей практикой, используемой Google и другими техническими гигантами, которые использовали контейнеры в производстве в течение многих лет. Это улучшает сигнал к шуму сканеров (например, CVE) и снижает бремя установления происхождения до того, что вам нужно.
Изображения диспродажи очень маленькие . Наименьшее изображение распространения, gcr.io/distroless/static-debian12
, составляет около 2 мибов. Это около 50% от размера alpine
(~ 5 мибов) и менее 2% от размера debian
(124 MIB).
Эти изображения построены с использованием Bazel, но они также могут использоваться через другие инструменты для сборки изображения Docker.
Следующие изображения в настоящее время опубликованы и обновляются проектом Distroless (см. Support_policy для сроков поддержки)
Изображение | Теги | Архитектура суффиксы |
---|---|---|
gcr.io/distroless/static-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/base-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/base-nossl-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/cc-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/python3-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64 |
gcr.io/distroless/java-base-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, S390X, PPC64LE |
gcr.io/distroless/java17-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, S390X, PPC64LE |
gcr.io/distroless/java21-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, PPC64LE |
gcr.io/distroless/nodejs18-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/nodejs20-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, ARM, S390X, PPC64LE |
gcr.io/distroless/nodejs22-debian12 | Последние, нереализованные, отладка, отладка | AMD64, ARM64, ARM, S390X, PPC64LE |
Эти изображения относятся к индексам изображений со ссылками на все поддерживаемые архитектуры. Специфические изображения с архитектурой могут быть непосредственно упоминаются с использованием дополнительного суффикса архитектуры на теге, например, gcr.io/distroless/static-debian12:latest-amd64
Любые другие теги считаются устаревшими и больше не обновляются
Все изображения пиклерополощи подписаны Cosign с эмпюмерными клавишами (без ключа) - это единственный поддерживаемый механизм, начиная с ноября 2023 года. Мы рекомендуем проверить любое изображение, которое вы используете перед созданием вашего изображения. Вы можете проверить сигнатуру без ключа любого изображения распространения с:
cosign verify $IMAGE_NAME --certificate-oidc-issuer https://accounts.google.com --certificate-identity [email protected]
Обратите внимание, что изображения распространения по умолчанию не содержат оболочки. Это означает, что команда Dockerfile ENTRYPOINT
, когда определено, должна быть указана в vector
форме, чтобы избежать префикса времени выполнения контейнера с оболочкой.
Это работает:
ENTRYPOINT ["myapp"]
Но это не работает:
ENTRYPOINT "myapp"
По тем же причинам, если точка входа установлена на пустой вектор, команда CMD должна быть указана в vector
форме (см. Примеры ниже). Обратите внимание, что по умолчанию Static, Base и CC изображения имеют пустую векторную точку входа. Изображения со включенным языковым средством выполнения имеют конкретный язык по умолчанию (см.: Java, Nodejs, Python3).
Docker Multi-Stage Builds упрощает использование изображений диспильщиков. Следуйте этим шагам, чтобы начать:
Выберите правильное базовое изображение для стека приложений.
Напишите многоэтапный файл Docker. Примечание: это требует докера 17.05 или выше.
Основная идея заключается в том, что у вас будет один этап для построения артефактов вашего приложения и вставить их в свое изображение времени выполнения. Если вы хотите узнать больше, см. Документацию по многоэтапным сборкам.
Вот быстрый пример для Go:
# Start by building the application.
FROM golang:1.18 as build
WORKDIR /go/src/app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 go build -o /go/bin/app
# Now copy it into our base image.
FROM gcr.io/distroless/static-debian12
COPY --from=build /go/bin/app /
CMD [ "/app" ]
Вы можете найти другие примеры здесь:
Чтобы запустить любой пример, перейдите в каталог для языка и запустите
docker build -t myapp .
docker run -t myapp
Для запуска Node.js Express App-Node-Express и выставьте порты контейнера:
npm install # Install express and its transitive dependencies
docker build -t myexpressapp . # Normal build command
docker run -p 3000:3000 -t myexpressapp
Это должно раскрыть приложение Express на ваш Localhost: 3000
Для получения полной документации о том, как использовать Bazel для генерации изображений контейнеров, см. Репозиторий Bazel-Contrib/Rules_OCI.
Документацию и пример того, как использовать диспетчер пакетов Debian на основе GO (текущий) для генерации конфигурации Bazel, см. /package_manager
Примеры можно найти в этом репозитории в каталоге примеров.
У нас есть несколько примеров о том, как запустить некоторые общие стеки приложений в каталоге /примеры. Смотрите здесь для:
Смотрите здесь для примеров, как выполнить некоторые общие задачи на вашем изображении:
Смотрите здесь для получения дополнительной информации о том, как эти изображения создаются и выпущены.
Изображения распространения основаны на Debian 12 (Bookworm). Изображения явно помечены суффиксами Debian версии (например, -debian12
). Указание изображения без распределения в настоящее время выберет изображения -debian12
, но это изменится в будущем на более новую версию Debian. Может быть полезно явно ссылаться на распределение, чтобы предотвратить разрыв сборки при выпуске следующей версии Debian.
Распространение отслеживает выпуск Debian вверх по течению, используя действия GitHub для автоматического генерации запроса на вытяжение при обновлениях.
Изображения распространения минимальны и не имеют доступа к оболочке. Набор изображений :debug
для каждого языка предоставляет оболочку Busybox для входа.
Например:
cd examples/python3/
Отредактируйте Dockerfile
, чтобы изменить окончательное изображение на :debug
:
FROM gcr.io/distroless/python3-debian12:debug
COPY . /app
WORKDIR /app
CMD [ "hello.py" , "/etc" ]
Затем создайте и запустите с помощью точки входа в оболочки:
$ docker build -t my_debug_image .
$ docker run --entrypoint=sh -ti my_debug_image
/app # ls
BUILD Dockerfile hello.py
ПРИМЕЧАНИЕ. Если в изображении, которое вы используете, уже есть тег, например,
gcr.io/distroless/java17-debian12:nonroot
, используйте Tagdebug-<existing tag>
вместо, например,gcr.io/distroless/java17-debian12:debug-nonroot
.
Примечание. LDD не установлен в базовом изображении, так как это сценарий оболочки, вы можете скопировать его или загрузить его.
Если ваш проект использует дистрибутив, отправьте пиар, чтобы добавить свой проект здесь!